MultiQC Jupyter Notebook Example¶
This notebook has some example code showing how MultiQC can be used within an interactive analysis, such as a Jupyter Notebook.
MultiQC is written in Python, so must be used in a Python environment. MultiQC can be installed in a variety of ways: see the documentation for more information. Note that MultiQC must be installed into the notebook kernel.
Let's install MultiQC using pip from source. Note the %
magic which installs the package into the kernel, and not the jupyter environment. In order for the environment to pick the updated package, we call the reset command to restart kernel.
%pip install --quiet multiqc pandas
%reset -f
Now let's import the multiqc
package into your workbook.
import multiqc
Great! Now let's check that it's working properly by printing the version that we're using.
print(multiqc.__version__)
1.24.1
Before we can use any outputs from MultiQC, we must first run it on some data. Let's grab results from a test run of the nf-core/viralrecon pipeline.
!test -d "data" || (wget https://multiqc.info/examples/jupyter/data.zip && unzip -qq data.zip && rm data.zip)
You should now see a folder called data/
in your notebook work directory with a bunch of log files from read processing, assembly, alignment, and variant calling. Now let's parse some of those logs.
%ls data
assembly/ pipeline_info/ fastp/ summary_assembly_metrics_mqc.csv fastqc/ summary_variants_metrics_mqc.csv kraken2/ variants/
Parsing data¶
Let's parse some fastp
logs
multiqc.parse_logs('./data/fastp')
/// https://multiqc.info 🔍 v1.24.1
file_search | Search path: /Users/vlad/git/website/public/examples/jupyter/data/fastp
searching | 0% 0/6 searching
searching | ██████▋ 17% 1/6 data/fastp/SAMPLE2_PE.fastp.html
searching | █████████████▎ 33% 2/6 data/fastp/SAMPLE1_PE.fastp.html
searching | ████████████████████ 50% 3/6 data/fastp/SAMPLE3_SE.fastp.json
searching | ██████████████████████████▋ 67% 4/6 data/fastp/SAMPLE3_SE.fastp.html
searching | █████████████████████████████████▎ 83% 5/6 data/fastp/SAMPLE1_PE.fastp.json
searching | ████████████████████████████████████████ 100% 6/6 data/fastp/SAMPLE2_PE.fastp.json
searching | ████████████████████████████████████████ 100% 6/6
searching | ████████████████████████████████████████ 100% 6/6
searching | ████████████████████████████████████████ 100% 6/6
fastp | Found 3 reports
MultiQC parsed and loaded the fastp
results into memory. Let's inspect them.
multiqc.list_modules()
['fastp']
multiqc.list_samples()
['SAMPLE1_PE', 'SAMPLE2_PE', 'SAMPLE3_SE']
multiqc.list_data_sources()
['/Users/vlad/git/website/public/examples/jupyter/data/fastp/SAMPLE3_SE.fastp.json', '/Users/vlad/git/website/public/examples/jupyter/data/fastp/SAMPLE1_PE.fastp.json', '/Users/vlad/git/website/public/examples/jupyter/data/fastp/SAMPLE2_PE.fastp.json']
sample1_result = multiqc.get_module_data(module="fastp", sample="SAMPLE1_PE")
sample1_result["summary"]
{'fastp_version': '0.23.2', 'sequencing': 'paired end (301 cycles + 301 cycles)', 'before_filtering': {'total_reads': 55442, 'total_bases': 16571632, 'q20_bases': 16267224, 'q30_bases': 15853021, 'q20_rate': 0.981631, 'q30_rate': 0.956636, 'read1_mean_length': 298, 'read2_mean_length': 298, 'gc_content': 0.38526}, 'after_filtering': {'total_reads': 48270, 'total_bases': 14363465, 'q20_bases': 14323363, 'q30_bases': 14199841, 'q20_rate': 0.997208, 'q30_rate': 0.988608, 'read1_mean_length': 298, 'read2_mean_length': 296, 'gc_content': 0.383991}}
The MultiQC module for fastp
implements several plots. The function below lists plot sections, groupped by module name.
multiqc.list_plots()
{'fastp': ['Filtered Reads', 'Insert Sizes', {'Sequence Quality': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}, {'GC Content': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}, {'N content': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}]}
You can use this information to call multiqc.get_plot("<module">, "<section>")
to retrieve plot object, and show it with plot.show()
.
When plot has several datasets (like "Sequence Quality", "GC Content", and "N Content" plots), pass the dataset name as well into plot.show(dataset_id="<dataset>")
.
Let's display the GC Content plot.
plot = multiqc.get_plot("fastp", "GC Content")
plot.show(dataset_id="Read 2: Before filtering")
You can also save plot to a file using the plot.save()
method instead:
plot.save("gc_content.html") # will save an interactive HTML
plot.save("gc_content.png") # will save a flat image
plot | Plot saved to gc_content.html
plot | Plot saved to gc_content.png
Adding more modules¶
So far we only parsed logs for one module. Now, let's parse more. The original viralrecon workflow uses a custom script to summarize data from multiple modules, and we are going to do that interactively, and after that, generate an HTML report.
We also notice that the viralrecon workflow runs QUAST several times: for each assembler separately, and then for the consensus sequence. To keep each run in a separate section, we will use the module_order configuration option to provide path filters for each QUAST run.
Any custom settings supported by MultiQC can be passed to the function call like that, for example, extra_fn_clean_exts
can be used to trim additional endings from sample names.
import multiqc
multiqc.parse_logs(
"./data/assembly",
"./data/kraken2",
"./data/variants",
"./data/fastqc",
module_order=[
dict(
quast=dict(
name="VARIANTS: QUAST",
anchor="quast_variants",
info="This section of the report shows QUAST QC results for the consensus sequence.",
path_filters=["*/variants/*"],
)
),
dict(
quast=dict(
name="ASSEMBLY: QUAST (SPAdes)",
anchor="quast_spades",
info="This section of the report shows QUAST results from SPAdes de novo assembly.",
path_filters=["*/spades/*"],
)
),
],
extra_fn_clean_exts=[".unclassified", ".pangolin", " MN908947.3", " MN908947.3"]
)
multiqc.list_modules()
/// https://multiqc.info 🔍 v1.24.1
file_search | Search path: /Users/vlad/git/website/public/examples/jupyter/data/assembly
file_search | Search path: /Users/vlad/git/website/public/examples/jupyter/data/kraken2
file_search | Search path: /Users/vlad/git/website/public/examples/jupyter/data/variants
file_search | Search path: /Users/vlad/git/website/public/examples/jupyter/data/fastqc
searching | 0% 0/339 searching
searching | 0% 1/339 y/cutadapt/log/SAMPLE2_PE.primer_trim.cutadapt.log
searching | ▏ 1% 2/339 y/cutadapt/log/SAMPLE3_SE.primer_trim.cutadapt.log
searching | ▎ 1% 3/339 y/cutadapt/log/SAMPLE1_PE.primer_trim.cutadapt.log
searching | ▍ 1% 4/339 /cutadapt/fastqc/SAMPLE3_SE.primer_trim_fastqc.zip
searching | ▌ 1% 5/339 tadapt/fastqc/SAMPLE2_PE.primer_trim_2_fastqc.html
searching | ▋ 2% 6/339 tadapt/fastqc/SAMPLE1_PE.primer_trim_2_fastqc.html
searching | ▊ 2% 7/339 tadapt/fastqc/SAMPLE1_PE.primer_trim_1_fastqc.html
searching | ▉ 2% 8/339 utadapt/fastqc/SAMPLE2_PE.primer_trim_2_fastqc.zip
searching | █ 3% 9/339 utadapt/fastqc/SAMPLE1_PE.primer_trim_1_fastqc.zip
searching | █▏ 3% 10/339 tadapt/fastqc/SAMPLE2_PE.primer_trim_1_fastqc.html
searching | █▎ 3% 11/339 cutadapt/fastqc/SAMPLE3_SE.primer_trim_fastqc.html
searching | █▍ 4% 12/339 cutadapt/fastqc/SAMPLE3_SE.primer_trim_fastqc.html
searching | █▍ 4% 12/339 utadapt/fastqc/SAMPLE2_PE.primer_trim_1_fastqc.zip
searching | █▌ 4% 13/339 utadapt/fastqc/SAMPLE1_PE.primer_trim_2_fastqc.zip
searching | █▋ 4% 14/339 tats/SAMPLE3_SE-scaffolds_genomic_features_any.txt
searching | █▊ 4% 15/339 l/quast/genome_stats/genome_fraction_histogram.pdf
searching | █▉ 5% 16/339 l/quast/genome_stats/SAMPLE3_SE-scaffolds_gaps.txt
searching | ██ 5% 17/339 tats/SAMPLE1_PE-scaffolds_genomic_features_any.txt
searching | ██ 5% 18/339 l/quast/genome_stats/SAMPLE1_PE-scaffolds_gaps.txt
searching | ██▏ 6% 19/339 tats/SAMPLE2_PE-scaffolds_genomic_features_any.txt
searching | ██▎ 6% 20/339 al/quast/genome_stats/features_cumulative_plot.pdf
searching | ██▍ 6% 21/339 quast/genome_stats/complete_features_histogram.pdf
searching | ██▌ 6% 22/339 viral/quast/genome_stats/features_frcurve_plot.pdf
searching | ██▋ 7% 23/339 spades/rnaviral/quast/genome_stats/genome_info.txt
searching | ██▊ 7% 24/339 l/quast/genome_stats/SAMPLE2_PE-scaffolds_gaps.txt
searching | ██▉ 7% 25/339 sembly/spades/rnaviral/quast/transposed_report.txt
searching | ███ 8% 26/339 sembly/spades/rnaviral/quast/transposed_report.tex
searching | ███▏ 8% 27/339 data/assembly/spades/rnaviral/quast/icarus.html
searching | ███▎ 8% 28/339 des/rnaviral/quast/basic_stats/cumulative_plot.pdf
searching | ███▍ 9% 29/339 mbly/spades/rnaviral/quast/basic_stats/Nx_plot.pdf
searching | ███▌ 9% 30/339 _stats/SAMPLE3_SE-scaffolds_coverage_histogram.pdf
searching | ███▋ 9% 31/339 sic_stats/SAMPLE2_PE.scaffolds_GC_content_plot.pdf
searching | ███▊ 9% 32/339 sic_stats/SAMPLE1_PE.scaffolds_GC_content_plot.pdf
searching | ███▉ 10% 33/339 sic_stats/SAMPLE3_SE.scaffolds_GC_content_plot.pdf
searching | ████ 10% 34/339 ly/spades/rnaviral/quast/basic_stats/gc.icarus.txt
searching | ████▏ 10% 35/339 bly/spades/rnaviral/quast/basic_stats/NGx_plot.pdf
searching | ████▏ 11% 36/339 des/rnaviral/quast/basic_stats/GC_content_plot.pdf
searching | ████▎ 11% 37/339 _stats/SAMPLE2_PE-scaffolds_coverage_histogram.pdf
searching | ████▍ 11% 38/339 /rnaviral/quast/basic_stats/coverage_histogram.pdf
searching | ████▌ 12% 39/339 _stats/SAMPLE1_PE-scaffolds_coverage_histogram.pdf
searching | ████▋ 12% 40/339 s/rnaviral/quast/aligned_stats/cumulative_plot.pdf
searching | ████▊ 12% 41/339 /spades/rnaviral/quast/aligned_stats/NGAx_plot.pdf
searching | ████▉ 12% 42/339 y/spades/rnaviral/quast/aligned_stats/NAx_plot.pdf
searching | █████ 13% 43/339 sembly/spades/rnaviral/quast/transposed_report.tsv
searching | █████▏ 13% 44/339 data/assembly/spades/rnaviral/quast/report.tex
searching | █████▎ 13% 45/339 data/assembly/spades/rnaviral/quast/report.txt
searching | █████▍ 14% 46/339 data/assembly/spades/rnaviral/quast/report.tsv
searching | █████▌ 14% 47/339 data/assembly/spades/rnaviral/quast/report.html
searching | █████▋ 14% 48/339 data/assembly/spades/rnaviral/quast/report.pdf
searching | █████▊ 14% 49/339 data/assembly/spades/rnaviral/quast/quast.log
searching | █████▉ 15% 50/339 data/kraken2/SAMPLE3_SE.kraken2.report.txt
searching | ██████ 15% 51/339 data/kraken2/SAMPLE1_PE.kraken2.report.txt
searching | ██████▏ 15% 52/339 data/kraken2/SAMPLE2_PE.kraken2.report.txt
searching | ██████▎ 16% 53/339 tie2/samtools_stats/SAMPLE3_SE.sorted.bam.idxstats
searching | ██████▎ 16% 54/339 tie2/samtools_stats/SAMPLE1_PE.sorted.bam.flagstat
searching | ██████▍ 16% 55/339 bowtie2/samtools_stats/SAMPLE2_PE.sorted.bam.stats
searching | ██████▌ 17% 56/339 ols_stats/SAMPLE2_PE.ivar_trim.sorted.bam.flagstat
searching | ██████▋ 17% 57/339 mtools_stats/SAMPLE3_SE.ivar_trim.sorted.bam.stats
searching | ██████▊ 17% 58/339 tie2/samtools_stats/SAMPLE2_PE.sorted.bam.flagstat
searching | ██████▉ 17% 59/339 bowtie2/samtools_stats/SAMPLE1_PE.sorted.bam.stats
searching | ███████ 18% 60/339 ols_stats/SAMPLE1_PE.ivar_trim.sorted.bam.flagstat
searching | ███████▏ 18% 61/339 bowtie2/samtools_stats/SAMPLE3_SE.sorted.bam.stats
searching | ███████▎ 18% 62/339 ols_stats/SAMPLE3_SE.ivar_trim.sorted.bam.flagstat
searching | ███████▍ 19% 63/339 mtools_stats/SAMPLE1_PE.ivar_trim.sorted.bam.stats
searching | ███████▌ 19% 64/339 tie2/samtools_stats/SAMPLE2_PE.sorted.bam.idxstats
searching | ███████▋ 19% 65/339 ols_stats/SAMPLE2_PE.ivar_trim.sorted.bam.idxstats
searching | ███████▊ 19% 66/339 mtools_stats/SAMPLE2_PE.ivar_trim.sorted.bam.stats
searching | ███████▉ 20% 67/339 tie2/samtools_stats/SAMPLE3_SE.sorted.bam.flagstat
searching | ████████ 20% 68/339 tie2/samtools_stats/SAMPLE1_PE.sorted.bam.idxstats
searching | ████████▏ 20% 69/339 ols_stats/SAMPLE1_PE.ivar_trim.sorted.bam.idxstats
searching | ████████▎ 21% 70/339 ols_stats/SAMPLE3_SE.ivar_trim.sorted.bam.idxstats
searching | ████████▍ 21% 71/339 mosdepth/amplicon/SAMPLE2_PE.mosdepth.coverage.tsv
searching | ████████▍ 21% 72/339 mosdepth/amplicon/SAMPLE2_PE.mosdepth.coverage.pdf
searching | ████████▌ 22% 73/339 mosdepth/amplicon/SAMPLE3_SE.mosdepth.coverage.tsv
searching | ████████▋ 22% 74/339 mosdepth/amplicon/SAMPLE3_SE.mosdepth.coverage.pdf
searching | ████████▊ 22% 75/339 mosdepth/amplicon/SAMPLE1_PE.mosdepth.coverage.pdf
searching | ████████▉ 22% 76/339 /mosdepth/amplicon/SAMPLE3_SE.mosdepth.summary.txt
searching | █████████ 23% 77/339 /mosdepth/amplicon/SAMPLE2_PE.mosdepth.summary.txt
searching | █████████▏ 23% 78/339 mosdepth/amplicon/SAMPLE1_PE.mosdepth.coverage.tsv
searching | █████████▎ 23% 79/339 osdepth/amplicon/all_samples.mosdepth.coverage.tsv
searching | █████████▍ 24% 80/339 mosdepth/amplicon/all_samples.mosdepth.heatmap.pdf
searching | █████████▌ 24% 81/339 mosdepth/amplicon/all_samples.mosdepth.heatmap.tsv
searching | █████████▋ 24% 82/339 /mosdepth/amplicon/SAMPLE1_PE.mosdepth.summary.txt
searching | █████████▊ 24% 83/339 2/mosdepth/genome/SAMPLE2_PE.mosdepth.coverage.tsv
searching | █████████▉ 25% 84/339 2/mosdepth/genome/SAMPLE2_PE.mosdepth.coverage.pdf
searching | ██████████ 25% 85/339 2/mosdepth/genome/SAMPLE3_SE.mosdepth.coverage.tsv
searching | ██████████▏ 25% 86/339 2/mosdepth/genome/SAMPLE3_SE.mosdepth.coverage.pdf
searching | ██████████▎ 26% 87/339 2/mosdepth/genome/SAMPLE1_PE.mosdepth.coverage.pdf
searching | ██████████▍ 26% 88/339 e2/mosdepth/genome/SAMPLE3_SE.mosdepth.summary.txt
searching | ██████████▌ 26% 89/339 e2/mosdepth/genome/SAMPLE2_PE.mosdepth.summary.txt
searching | ██████████▌ 27% 90/339 2/mosdepth/genome/SAMPLE1_PE.mosdepth.coverage.tsv
searching | ██████████▋ 27% 91/339 /mosdepth/genome/all_samples.mosdepth.coverage.tsv
searching | ██████████▊ 27% 92/339 e2/mosdepth/genome/SAMPLE1_PE.mosdepth.summary.txt
searching | ██████████▉ 27% 93/339 ollectMultipleMetrics.quality_distribution_metrics
searching | ███████████ 28% 94/339 PE.CollectMultipleMetrics.quality_by_cycle_metrics
searching | ███████████▏ 28% 95/339 MultipleMetrics.base_distribution_by_cycle_metrics
searching | ███████████▎ 28% 96/339 SE.CollectMultipleMetrics.quality_by_cycle_metrics
searching | ███████████▍ 29% 97/339 SE.CollectMultipleMetrics.quality_by_cycle_metrics
searching | ███████████▍ 29% 97/339 ollectMultipleMetrics.quality_distribution_metrics
searching | ███████████▌ 29% 98/339 PLE2_PE.CollectMultipleMetrics.insert_size_metrics
searching | ███████████▋ 29% 99/339 E.CollectMultipleMetrics.alignment_summary_metrics
searching | ███████████▊ 29% 100/339 MultipleMetrics.base_distribution_by_cycle_metrics
searching | ███████████▉ 30% 101/339 E.CollectMultipleMetrics.alignment_summary_metrics
searching | ████████████ 30% 102/339 variants/bowtie2/log/SAMPLE2_PE.ivar_trim.ivar.log
searching | ████████████▏ 30% 103/339 data/variants/bowtie2/log/SAMPLE3_SE.bowtie2.log
searching | ████████████▎ 31% 104/339 variants/bowtie2/log/SAMPLE3_SE.ivar_trim.ivar.log
searching | ████████████▍ 31% 105/339 data/variants/bowtie2/log/SAMPLE1_PE.bowtie2.log
searching | ████████████▌ 31% 106/339 variants/bowtie2/log/SAMPLE1_PE.ivar_trim.ivar.log
searching | ████████████▋ 32% 107/339 data/variants/bowtie2/log/SAMPLE2_PE.bowtie2.log
searching | ████████████▋ 32% 108/339 data/variants/ivar/SAMPLE1_PE.tsv
searching | ████████████▊ 32% 109/339 ivar/consensus/bcftools/SAMPLE1_PE.filtered.vcf.gz
searching | ████████████▉ 32% 110/339 ivar/consensus/bcftools/SAMPLE3_SE.filtered.vcf.gz
searching | █████████████ 33% 111/339 ts/ivar/consensus/bcftools/SAMPLE3_SE.consensus.fa
searching | █████████████▏ 33% 112/339 s/ivar/consensus/bcftools/nextclade/SAMPLE3_SE.csv
searching | █████████████▎ 33% 113/339 s/ivar/consensus/bcftools/nextclade/SAMPLE2_PE.csv
searching | █████████████▍ 34% 114/339 s/ivar/consensus/bcftools/nextclade/SAMPLE1_PE.csv
searching | █████████████▌ 34% 115/339 ivar/consensus/bcftools/SAMPLE2_PE.filtered.vcf.gz
searching | █████████████▋ 34% 116/339 ts/ivar/consensus/bcftools/SAMPLE2_PE.consensus.fa
searching | █████████████▊ 35% 117/339 onsensus/bcftools/pangolin/SAMPLE1_PE.pangolin.csv
searching | █████████████▉ 35% 118/339 onsensus/bcftools/pangolin/SAMPLE2_PE.pangolin.csv
searching | ██████████████ 35% 119/339 onsensus/bcftools/pangolin/SAMPLE3_SE.pangolin.csv
searching | ██████████████▏ 35% 120/339 /consensus/bcftools/SAMPLE3_SE.filtered.vcf.gz.tbi
searching | ██████████████▎ 36% 121/339 ools/base_qc/SAMPLE2_PE.consensus.ACTG_density.pdf
searching | ██████████████▍ 36% 122/339 us/bcftools/base_qc/SAMPLE3_SE.consensus.N_run.tsv
searching | ██████████████▌ 36% 123/339 cftools/base_qc/SAMPLE2_PE.consensus.N_density.pdf
searching | ██████████████▋ 37% 124/339 tools/base_qc/SAMPLE3_SE.consensus.base_counts.tsv
searching | ██████████████▋ 37% 125/339 us/bcftools/base_qc/SAMPLE2_PE.consensus.N_run.tsv
searching | ██████████████▊ 37% 126/339 cftools/base_qc/SAMPLE3_SE.consensus.N_density.pdf
searching | ██████████████▉ 37% 127/339 ools/base_qc/SAMPLE3_SE.consensus.ACTG_density.pdf
searching | ███████████████ 38% 128/339 us/bcftools/base_qc/SAMPLE1_PE.consensus.N_run.tsv
searching | ███████████████▏ 38% 129/339 tools/base_qc/SAMPLE3_SE.consensus.base_counts.pdf
searching | ███████████████▎ 38% 130/339 tools/base_qc/SAMPLE2_PE.consensus.base_counts.tsv
searching | ███████████████▍ 39% 131/339 tools/base_qc/SAMPLE1_PE.consensus.base_counts.pdf
searching | ███████████████▌ 39% 132/339 cftools/base_qc/SAMPLE1_PE.consensus.N_density.pdf
searching | ███████████████▋ 39% 133/339 ools/base_qc/SAMPLE1_PE.consensus.ACTG_density.pdf
searching | ███████████████▊ 40% 134/339 tools/base_qc/SAMPLE2_PE.consensus.base_counts.pdf
searching | ███████████████▉ 40% 135/339 tools/base_qc/SAMPLE1_PE.consensus.base_counts.tsv
searching | ████████████████ 40% 136/339 s/quast/genome_stats/SAMPLE2_PE-consensus_gaps.txt
searching | ████████████████▏ 40% 137/339 s/quast/genome_stats/genome_fraction_histogram.pdf
searching | ████████████████▎ 41% 138/339 s/quast/genome_stats/SAMPLE1_PE-consensus_gaps.txt
searching | ████████████████▍ 41% 139/339 ls/quast/genome_stats/features_cumulative_plot.pdf
searching | ████████████████▌ 41% 140/339 s/quast/genome_stats/SAMPLE3_SE-consensus_gaps.txt
searching | ████████████████▋ 42% 141/339 tats/SAMPLE2_PE-consensus_genomic_features_any.txt
searching | ████████████████▊ 42% 142/339 quast/genome_stats/complete_features_histogram.pdf
searching | ████████████████▊ 42% 143/339 tats/SAMPLE1_PE-consensus_genomic_features_any.txt
searching | ████████████████▉ 42% 144/339 tools/quast/genome_stats/features_frcurve_plot.pdf
searching | █████████████████ 43% 145/339 sensus/bcftools/quast/genome_stats/genome_info.txt
searching | █████████████████▏ 43% 146/339 tats/SAMPLE3_SE-consensus_genomic_features_any.txt
searching | █████████████████▎ 43% 147/339 var/consensus/bcftools/quast/transposed_report.txt
searching | █████████████████▍ 44% 148/339 var/consensus/bcftools/quast/transposed_report.tex
searching | █████████████████▌ 44% 149/339 variants/ivar/consensus/bcftools/quast/icarus.html
searching | █████████████████▋ 44% 150/339 sus/bcftools/quast/basic_stats/cumulative_plot.pdf
searching | █████████████████▊ 45% 151/339 r/consensus/bcftools/quast/basic_stats/Nx_plot.pdf
searching | █████████████████▉ 45% 152/339 consensus/bcftools/quast/basic_stats/gc.icarus.txt
searching | ██████████████████ 45% 153/339 /consensus/bcftools/quast/basic_stats/NGx_plot.pdf
searching | ██████████████████▏ 45% 154/339 sic_stats/SAMPLE2_PE.consensus_GC_content_plot.pdf
searching | ██████████████████▎ 46% 155/339 sus/bcftools/quast/basic_stats/GC_content_plot.pdf
searching | ██████████████████▍ 46% 156/339 sic_stats/SAMPLE1_PE.consensus_GC_content_plot.pdf
searching | ██████████████████▌ 46% 157/339 sic_stats/SAMPLE3_SE.consensus_GC_content_plot.pdf
searching | ██████████████████▋ 47% 158/339 s/bcftools/quast/aligned_stats/cumulative_plot.pdf
searching | ██████████████████▊ 47% 159/339 nsensus/bcftools/quast/aligned_stats/NGAx_plot.pdf
searching | ██████████████████▉ 47% 160/339 onsensus/bcftools/quast/aligned_stats/NAx_plot.pdf
searching | ██████████████████▉ 47% 161/339 var/consensus/bcftools/quast/transposed_report.tsv
searching | ███████████████████ 48% 162/339 /variants/ivar/consensus/bcftools/quast/report.tex
searching | ███████████████████▏ 48% 163/339 /variants/ivar/consensus/bcftools/quast/report.txt
searching | ███████████████████▎ 48% 164/339 /variants/ivar/consensus/bcftools/quast/report.tsv
searching | ███████████████████▍ 49% 165/339 variants/ivar/consensus/bcftools/quast/report.html
searching | ███████████████████▌ 49% 166/339 /variants/ivar/consensus/bcftools/quast/report.pdf
searching | ███████████████████▋ 49% 167/339 a/variants/ivar/consensus/bcftools/quast/quast.log
searching | ███████████████████▊ 50% 168/339 /consensus/bcftools/SAMPLE1_PE.filtered.vcf.gz.tbi
searching | ███████████████████▉ 50% 169/339 ts/ivar/consensus/bcftools/SAMPLE1_PE.consensus.fa
searching | ████████████████████ 50% 170/339 /consensus/bcftools/SAMPLE2_PE.filtered.vcf.gz.tbi
searching | ████████████████████▏ 50% 171/339 data/variants/ivar/SAMPLE2_PE.vcf.gz.tbi
searching | ████████████████████▎ 51% 172/339 data/variants/ivar/SAMPLE1_PE.vcf.gz.tbi
searching | ████████████████████▍ 51% 173/339 data/variants/ivar/SAMPLE1_PE.vcf.gz
searching | ████████████████████▌ 51% 174/339 data/variants/ivar/SAMPLE3_SE.vcf.gz.tbi
searching | ████████████████████▋ 52% 175/339 data/variants/ivar/snpeff/SAMPLE1_PE.snpsift.txt
searching | ████████████████████▊ 52% 176/339 data/variants/ivar/snpeff/SAMPLE1_PE.snpeff.csv
searching | ████████████████████▉ 52% 177/339 data/variants/ivar/snpeff/SAMPLE1_PE.snpeff.vcf.gz
searching | █████████████████████ 53% 178/339 data/variants/ivar/snpeff/SAMPLE2_PE.snpeff.csv
searching | █████████████████████ 53% 179/339 /variants/ivar/snpeff/SAMPLE2_PE.snpeff.vcf.gz.tbi
searching | █████████████████████▏ 53% 180/339 data/variants/ivar/snpeff/SAMPLE2_PE.snpsift.txt
searching | █████████████████████▎ 53% 181/339 /variants/ivar/snpeff/SAMPLE3_SE.snpeff.vcf.gz.tbi
searching | █████████████████████▍ 54% 182/339 ariants/ivar/snpeff/SAMPLE3_SE.snpeff.summary.html
searching | █████████████████████▌ 54% 183/339 a/variants/ivar/snpeff/SAMPLE2_PE.snpeff.genes.txt
searching | █████████████████████▋ 54% 184/339 a/variants/ivar/snpeff/SAMPLE1_PE.snpeff.genes.txt
searching | █████████████████████▊ 55% 185/339 cftools_stats/SAMPLE3_SE.snpeff.bcftools_stats.txt
searching | █████████████████████▉ 55% 186/339 cftools_stats/SAMPLE1_PE.snpeff.bcftools_stats.txt
searching | ██████████████████████ 55% 187/339 cftools_stats/SAMPLE2_PE.snpeff.bcftools_stats.txt
searching | ██████████████████████▏ 55% 188/339 data/variants/ivar/snpeff/SAMPLE3_SE.snpsift.txt
searching | ██████████████████████▎ 56% 189/339 data/variants/ivar/snpeff/SAMPLE3_SE.snpsift.txt
searching | ██████████████████████▎ 56% 189/339 data/variants/ivar/snpeff/SAMPLE3_SE.snpeff.csv
searching | ██████████████████████▍ 56% 190/339 /variants/ivar/snpeff/SAMPLE1_PE.snpeff.vcf.gz.tbi
searching | ██████████████████████▌ 56% 191/339 ariants/ivar/snpeff/SAMPLE1_PE.snpeff.summary.html
searching | ██████████████████████▋ 57% 192/339 a/variants/ivar/snpeff/SAMPLE3_SE.snpeff.genes.txt
searching | ██████████████████████▊ 57% 193/339 data/variants/ivar/snpeff/SAMPLE2_PE.snpeff.vcf.gz
searching | ██████████████████████▉ 57% 194/339 data/variants/ivar/snpeff/SAMPLE3_SE.snpeff.vcf.gz
searching | ███████████████████████ 58% 195/339 ariants/ivar/snpeff/SAMPLE2_PE.snpeff.summary.html
searching | ███████████████████████▏ 58% 196/339 data/variants/ivar/variants_long_table.csv
searching | ███████████████████████▏ 58% 197/339 /ivar/bcftools_stats/SAMPLE1_PE.bcftools_stats.txt
searching | ███████████████████████▎ 58% 198/339 /ivar/bcftools_stats/SAMPLE3_SE.bcftools_stats.txt
searching | ███████████████████████▍ 59% 199/339 /ivar/bcftools_stats/SAMPLE2_PE.bcftools_stats.txt
searching | ███████████████████████▌ 59% 200/339 data/variants/ivar/SAMPLE2_PE.tsv
searching | ███████████████████████▋ 59% 201/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_28094_28194.pdf
searching | ███████████████████████▊ 60% 202/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_25929_26029.pdf
searching | ███████████████████████▉ 60% 203/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_23746_23846.pdf
searching | ████████████████████████ 60% 204/339 ome/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_9427_9527.pdf
searching | ████████████████████████▏ 60% 205/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_14755_14855.pdf
searching | ████████████████████████▎ 61% 206/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_28607_28707.pdf
searching | ████████████████████████▍ 61% 207/339 e/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_28813_28913.pdf
searching | ████████████████████████▌ 61% 208/339 ome/SAMPLE2_PE/SAMPLE2_PE.MN908947.3_1825_1925.pdf
searching | ████████████████████████▋ 62% 209/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21102_21202.pdf
searching | ████████████████████████▊ 62% 210/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_8272_8372.pdf
searching | ████████████████████████▉ 62% 211/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21116_21216.pdf
searching | █████████████████████████ 63% 212/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23454_23554.pdf
searching | █████████████████████████▏ 63% 213/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_28607_28707.pdf
searching | █████████████████████████▎ 63% 214/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21097_21197.pdf
searching | █████████████████████████▎ 63% 215/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4396_4496.pdf
searching | █████████████████████████▍ 64% 216/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23767_23867.pdf
searching | █████████████████████████▌ 64% 217/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3789_3889.pdf
searching | █████████████████████████▋ 64% 218/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7634_7734.pdf
searching | █████████████████████████▊ 65% 219/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7644_7744.pdf
searching | █████████████████████████▉ 65% 220/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4380_4480.pdf
searching | ██████████████████████████ 65% 221/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25620_25720.pdf
searching | ██████████████████████████▏ 65% 222/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7635_7735.pdf
searching | ██████████████████████████▎ 66% 223/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25610_25710.pdf
searching | ██████████████████████████▍ 66% 224/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_14755_14855.pdf
searching | ██████████████████████████▌ 66% 225/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21118_21218.pdf
searching | ██████████████████████████▋ 67% 226/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25604_25704.pdf
searching | ██████████████████████████▊ 67% 227/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4398_4498.pdf
searching | ██████████████████████████▉ 67% 228/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22281_22381.pdf
searching | ███████████████████████████ 68% 229/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25616_25716.pdf
searching | ███████████████████████████▏ 68% 230/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3796_3896.pdf
searching | ███████████████████████████▎ 68% 231/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19239_19339.pdf
searching | ███████████████████████████▎ 68% 232/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4389_4489.pdf
searching | ███████████████████████████▍ 69% 233/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_8274_8374.pdf
searching | ███████████████████████████▌ 69% 234/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4963_5063.pdf
searching | ███████████████████████████▋ 69% 235/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7624_7724.pdf
searching | ███████████████████████████▊ 70% 236/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23465_23565.pdf
searching | ███████████████████████████▉ 70% 237/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_1825_1925.pdf
searching | ████████████████████████████ 70% 238/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7632_7732.pdf
searching | ████████████████████████████▏ 71% 239/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19247_19347.pdf
searching | ████████████████████████████▎ 71% 240/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4386_4486.pdf
searching | ████████████████████████████▍ 71% 241/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21330_21430.pdf
searching | ████████████████████████████▌ 71% 242/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19241_19341.pdf
searching | ████████████████████████████▋ 72% 243/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27467_27567.pdf
searching | ████████████████████████████▊ 72% 244/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3798_3898.pdf
searching | ████████████████████████████▉ 72% 245/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21098_21198.pdf
searching | █████████████████████████████ 73% 246/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27473_27573.pdf
searching | █████████████████████████████▏ 73% 247/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22294_22394.pdf
searching | █████████████████████████████▎ 73% 248/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3780_3880.pdf
searching | █████████████████████████████▍ 73% 249/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_9427_9527.pdf
searching | █████████████████████████████▍ 74% 250/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4383_4483.pdf
searching | █████████████████████████████▌ 74% 251/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_28094_28194.pdf
searching | █████████████████████████████▋ 74% 252/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23460_23560.pdf
searching | █████████████████████████████▊ 75% 253/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4382_4482.pdf
searching | █████████████████████████████▉ 75% 254/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25598_25698.pdf
searching | ██████████████████████████████ 75% 255/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_11669_11769.pdf
searching | ██████████████████████████████▏ 76% 256/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21112_21212.pdf
searching | ██████████████████████████████▎ 76% 257/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27482_27582.pdf
searching | ██████████████████████████████▍ 76% 258/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25606_25706.pdf
searching | ██████████████████████████████▌ 76% 259/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19226_19326.pdf
searching | ██████████████████████████████▋ 77% 260/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22285_22385.pdf
searching | ██████████████████████████████▊ 77% 261/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25612_25712.pdf
searching | ██████████████████████████████▉ 77% 262/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19232_19332.pdf
searching | ███████████████████████████████ 78% 263/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7638_7738.pdf
searching | ███████████████████████████████▏ 78% 264/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3802_3902.pdf
searching | ███████████████████████████████▎ 78% 265/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25600_25700.pdf
searching | ███████████████████████████████▍ 78% 266/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_20218_20318.pdf
searching | ███████████████████████████████▌ 79% 267/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_14358_14458.pdf
searching | ███████████████████████████████▌ 79% 268/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21327_21427.pdf
searching | ███████████████████████████████▋ 79% 269/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_2987_3087.pdf
searching | ███████████████████████████████▊ 80% 270/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23468_23568.pdf
searching | ███████████████████████████████▉ 80% 271/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27470_27570.pdf
searching | ████████████████████████████████ 80% 272/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27464_27564.pdf
searching | ████████████████████████████████▏ 81% 273/339 enome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_191_291.pdf
searching | ████████████████████████████████▎ 81% 274/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27476_27576.pdf
searching | ████████████████████████████████▍ 81% 275/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19244_19344.pdf
searching | ████████████████████████████████▌ 81% 276/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27462_27562.pdf
searching | ████████████████████████████████▋ 82% 277/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21335_21435.pdf
searching | ████████████████████████████████▊ 82% 278/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7641_7741.pdf
searching | ████████████████████████████████▉ 82% 279/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_27479_27579.pdf
searching | █████████████████████████████████ 83% 280/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22276_22376.pdf
searching | █████████████████████████████████▏ 83% 281/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4385_4485.pdf
searching | █████████████████████████████████▎ 83% 282/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23776_23876.pdf
searching | █████████████████████████████████▍ 83% 283/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21113_21213.pdf
searching | █████████████████████████████████▌ 84% 284/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7629_7729.pdf
searching | █████████████████████████████████▋ 84% 285/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_8280_8380.pdf
searching | █████████████████████████████████▋ 84% 286/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21115_21215.pdf
searching | █████████████████████████████████▊ 85% 287/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_3783_3883.pdf
searching | █████████████████████████████████▉ 85% 288/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19229_19329.pdf
searching | ██████████████████████████████████ 85% 289/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25929_26029.pdf
searching | ██████████████████████████████████▏ 86% 290/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25601_25701.pdf
searching | ██████████████████████████████████▎ 86% 291/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25601_25701.pdf
searching | ██████████████████████████████████▎ 86% 291/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22296_22396.pdf
searching | ██████████████████████████████████▍ 86% 292/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23459_23559.pdf
searching | ██████████████████████████████████▌ 86% 293/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21109_21209.pdf
searching | ██████████████████████████████████▋ 87% 294/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_19235_19335.pdf
searching | ██████████████████████████████████▊ 87% 295/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25607_25707.pdf
searching | ██████████████████████████████████▉ 87% 296/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25613_25713.pdf
searching | ███████████████████████████████████ 88% 297/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23353_23453.pdf
searching | ███████████████████████████████████▏ 88% 298/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_4392_4492.pdf
searching | ███████████████████████████████████▎ 88% 299/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25623_25723.pdf
searching | ███████████████████████████████████▍ 88% 300/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_22278_22378.pdf
searching | ███████████████████████████████████▌ 89% 301/339 ome/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_7626_7726.pdf
searching | ███████████████████████████████████▋ 89% 302/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_25597_25697.pdf
searching | ███████████████████████████████████▊ 89% 303/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23469_23569.pdf
searching | ███████████████████████████████████▊ 90% 304/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_23778_23878.pdf
searching | ███████████████████████████████████▉ 90% 305/339 e/SAMPLE3_SE/SAMPLE3_SE.MN908947.3_21332_21432.pdf
searching | ████████████████████████████████████ 90% 306/339 ome/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_1825_1925.pdf
searching | ████████████████████████████████████▏ 91% 307/339 enome/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_191_291.pdf
searching | ████████████████████████████████████▎ 91% 308/339 e/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_23746_23846.pdf
searching | ████████████████████████████████████▍ 91% 309/339 e/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_23353_23453.pdf
searching | ████████████████████████████████████▌ 91% 310/339 ome/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_2987_3087.pdf
searching | ████████████████████████████████████▋ 92% 311/339 e/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_11669_11769.pdf
searching | ████████████████████████████████████▊ 92% 312/339 e/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_14358_14458.pdf
searching | ████████████████████████████████████▉ 92% 313/339 e/SAMPLE1_PE/SAMPLE1_PE.MN908947.3_20218_20318.pdf
searching | █████████████████████████████████████ 93% 314/339 ta/variants/ivar/log/SAMPLE2_PE.variant_counts.log
searching | █████████████████████████████████████▏ 93% 315/339 ta/variants/ivar/log/SAMPLE3_SE.variant_counts.log
searching | █████████████████████████████████████▎ 93% 316/339 ta/variants/ivar/log/SAMPLE1_PE.variant_counts.log
searching | █████████████████████████████████████▍ 94% 317/339 data/variants/ivar/SAMPLE3_SE.tsv
searching | █████████████████████████████████████▌ 94% 318/339 data/variants/ivar/SAMPLE2_PE.vcf.gz
searching | █████████████████████████████████████▋ 94% 319/339 data/variants/ivar/SAMPLE3_SE.vcf.gz
searching | █████████████████████████████████████▊ 94% 320/339 data/fastqc/trim/SAMPLE2_PE_2_fastqc.html
searching | █████████████████████████████████████▉ 95% 321/339 data/fastqc/trim/SAMPLE1_PE_1_fastqc.zip
searching | █████████████████████████████████████▉ 95% 322/339 data/fastqc/trim/SAMPLE3_SE_fastqc.zip
searching | ██████████████████████████████████████ 95% 323/339 data/fastqc/trim/SAMPLE2_PE_1_fastqc.html
searching | ██████████████████████████████████████▏ 96% 324/339 data/fastqc/trim/SAMPLE2_PE_2_fastqc.zip
searching | ██████████████████████████████████████▎ 96% 325/339 data/fastqc/trim/SAMPLE2_PE_1_fastqc.zip
searching | ██████████████████████████████████████▍ 96% 326/339 data/fastqc/trim/SAMPLE3_SE_fastqc.html
searching | ██████████████████████████████████████▌ 96% 327/339 data/fastqc/trim/SAMPLE1_PE_1_fastqc.html
searching | ██████████████████████████████████████▋ 97% 328/339 data/fastqc/trim/SAMPLE1_PE_2_fastqc.zip
searching | ██████████████████████████████████████▊ 97% 329/339 data/fastqc/trim/SAMPLE1_PE_2_fastqc.html
searching | ██████████████████████████████████████▉ 97% 330/339 data/fastqc/raw/SAMPLE2_PE_2_fastqc.html
searching | ███████████████████████████████████████ 98% 331/339 data/fastqc/raw/SAMPLE1_PE_1_fastqc.zip
searching | ███████████████████████████████████████▏ 98% 332/339 data/fastqc/raw/SAMPLE3_SE_fastqc.zip
searching | ███████████████████████████████████████▎ 98% 333/339 data/fastqc/raw/SAMPLE2_PE_1_fastqc.html
searching | ███████████████████████████████████████▍ 99% 334/339 data/fastqc/raw/SAMPLE2_PE_2_fastqc.zip
searching | ███████████████████████████████████████▌ 99% 335/339 data/fastqc/raw/SAMPLE2_PE_1_fastqc.zip
searching | ███████████████████████████████████████▋ 99% 336/339 data/fastqc/raw/SAMPLE3_SE_fastqc.html
searching | ███████████████████████████████████████▊ 99% 337/339 data/fastqc/raw/SAMPLE1_PE_1_fastqc.html
searching | ███████████████████████████████████████▉ 100% 338/339 data/fastqc/raw/SAMPLE1_PE_2_fastqc.zip
searching | ████████████████████████████████████████ 100% 339/339 data/fastqc/raw/SAMPLE1_PE_2_fastqc.html
searching | ████████████████████████████████████████ 100% 339/339
searching | ████████████████████████████████████████ 100% 339/339
searching | ████████████████████████████████████████ 100% 339/339
bcftools | Found 3 stats reports
bowtie2 | Found 3 reports
cutadapt | Found 3 reports
fastqc | Found 7 reports
kraken | Found 3 reports
mosdepth | Found reports for 3 samples
nextclade | Found 3 samples
pangolin | Found 3 samples
picard | Found 2 AlignmentSummaryMetrics reports
picard | Found 3 BaseDistributionByCycleMetrics reports
picard | Found 1 InsertSizeMetrics reports
picard | Found 2 QualityByCycleMetrics reports
picard | Found 2 QualityScoreDistributionMetrics reports
samtools | Found 3 stats reports
samtools | Found 3 flagstat reports
samtools | Found 3 idxstats reports
snpeff | Found 3 reports
quast | Found 3 reports
quast | Found 3 reports
['fastp', 'bcftools', 'bowtie2', 'cutadapt', 'fastqc', 'kraken', 'mosdepth', 'nextclade', 'pangolin', 'picard', 'samtools', 'snpeff', 'quast_variants', 'quast_spades']
multiqc.list_samples()
['SAMPLE1_PE', 'SAMPLE1_PE_1', 'SAMPLE1_PE_2', 'SAMPLE2_PE', 'SAMPLE2_PE_1', 'SAMPLE2_PE_2', 'SAMPLE2_PE_R1', 'SAMPLE2_PE_R2', 'SAMPLE3_SE']
Now there are many more plots available in the session
from pprint import pprint
pprint(multiqc.list_plots())
{'bcftools': ['Variant Substitution Types', {'Variant Quality': ['Count SNP', 'Count Transitions', 'Count Transversions', 'Count Indels']}, 'Indel Distribution', 'Variant depths'], 'bowtie2': ['Single-end alignments', 'Paired-end alignments'], 'cutadapt': ['Filtered Reads', {'Trimmed Sequence Lengths': ['Counts', 'Obs/Exp']}], 'fastp': ['Filtered Reads', 'Insert Sizes', {'Sequence Quality': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}, {'GC Content': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}, {'N content': ['Read 1: Before filtering', 'Read 1: After filtering', 'Read 2: Before filtering', 'Read 2: After filtering']}], 'fastqc': ['Sequence Counts', 'Sequence Quality Histograms', 'Per Sequence Quality Scores', {'Per Sequence GC Content': ['Percentages', 'Counts']}, 'Per Base N Content', 'Sequence Length Distribution', 'Sequence Duplication Levels', 'Overrepresented sequences by sample', 'Top overrepresented sequences', 'Status Checks'], 'kraken': [{'Top taxa': ['Genus', 'Family', 'Order', 'Class', 'Phylum', 'Domain']}], 'mosdepth': [], 'nextclade': ['Run table'], 'pangolin': ['Run table'], 'picard': [{'Alignment Summary': ['Aligned Reads', 'Aligned Bases']}, 'Mean read length', {'Base Distribution': ['% Adenine', '% Cytosine', '% Guanine', '% Thymine', '% Undetermined']}, {'Insert Size': ['Counts', 'Percentages']}, 'Mean Base Quality by Cycle', 'Base Quality Distribution'], 'quast_spades': ['Assembly Statistics', 'Number of Contigs'], 'quast_variants': ['Assembly Statistics', 'Number of Contigs'], 'samtools': ['Percent mapped', 'Alignment stats', {'Flagstat': ['Read counts', 'Percentage of total']}, {'Mapped reads per contig': ['Normalised Counts', 'Observed over Expected Counts', 'Raw Counts']}], 'snpeff': ['Variants by Genomic Region', 'Variant Effects by Impact', 'Variants by Effect Types', 'Variants by Functional Class']}
plot = multiqc.get_plot(module="ASSEMBLY: QUAST (SPAdes)", section="Number of Contigs")
plot.show()
Now let's re-summarize the data and add a custom section into the report.
It will be a table, so we will need to define titles for the table columns (headers
) along with a value for each sample for each column.
We will use the multiqc.get_module_data()
and multiqc.get_general_stats_data()
methods to pull data parsed and summarized by modules.
headers = {
"input_reads": {
"title": "# Input reads",
"description": "Total number of reads in raw fastq file",
},
"trimmed_read_pairs": {
"title": "# Trimmed reads (Cutadapt)",
"description": "Total number of reads remaining after adapter/quality trimming with fastp",
},
"num_mapped_reads": {
"title": "# Mapped reads",
"description": "Total number of Bowtie2 mapped reads relative to the viral genome",
},
"pct_mapped_reads": {
"title": "% Mapped reads",
"description": "Percentage of Bowtie2 mapped reads relative to the viral genome",
"suffix": "%",
},
"non_host_reads": {
"title": "% Non-host reads (Kraken 2)",
"description": "Total number of non-host reads identified by Kraken2",
},
"cov_mean": {
"title": "Coverage",
"description": "Mean coverage calculated by mosdepth"
},
"number_of_SNPs": {
"title": "# SNPs",
"description": "Total number of SNPs",
},
"number_of_indels": {
"title": "# SNPs",
"description": "Total number of INDELs",
},
"missense": {
"title": "# Missense variants",
"description": "Total number of variants identified as missense mutations with SnpEff",
},
"n_contigs": {
"title": "# Contigs",
"description": "Total number of contigs in SPAdes assembly as calculated by QUAST",
},
"largest_contig": {
"title": "Largest contig",
"description": "Size of largest contig in SPAdes assembly as calculated by QUAST"
},
"genome_fraction": {
"title": "Genome fraction",
"suffix": "%",
"description": "% genome fraction for SPAdes assembly as calculated by QUAST",
},
"n50": {
"title": "N50",
"description": "N50 metric for SPAdes assembly as calculated by QUAST",
},
"lineage": {
"title": "Pangolin lineage",
"description": "Pangolin lineage inferred from the consensus sequence",
},
"clade": {
"title": "Nextclade clade",
"description": "Nextclade clade inferred from the consensus sequence",
},
}
from collections import defaultdict
summarized_data = defaultdict(dict)
for s in multiqc.list_samples():
if data := multiqc.get_module_data(sample=s, module="fastp"):
summarized_data[s]["input_reads"] = data["summary"]["before_filtering"]["total_reads"]
if data := multiqc.get_module_data(sample=s, module="Cutadapt"):
summarized_data[s]["trimmed_read_pairs"] = data.get("pairs_written")
if data := multiqc.get_module_data(sample=s, module="Bowtie 2 / HiSAT2"):
summarized_data[s]["pct_mapped_reads"] = data.get("overall_alignment_rate")
if data := multiqc.get_general_stats_data(sample=s):
summarized_data[s]["non_host_reads"] = data.get("Kraken.pct_unclassified")
summarized_data[s]["mean_coverage"] = data.get("Mosdepth.mean_coverage")
if data := multiqc.get_module_data(sample=s, module="Mosdepth"):
summarized_data[s]["cov_mean"] = data["mean_coverage"]
if data := multiqc.get_module_data(sample=s, module="SnpEff"):
summarized_data[s]["missense_variants"] = data["MISSENSE"]
if data := multiqc.get_module_data(sample=s, module="Bcftools"):
summarized_data[s]["number_of_SNPs"] = data["number_of_SNPs"]
summarized_data[s]["number_of_indels"] = data["number_of_indels"]
if data := multiqc.get_module_data(sample=s, module="VARIANTS: QUAST"):
summarized_data[s]["n_contigs"] = data["# contigs (>= 0 bp)"]
summarized_data[s]["largest_contig"] = data["Largest contig"]
summarized_data[s]["genome_fraction"] = data["Genome fraction (%)"]
summarized_data[s]["n50"] = data["N50"]
if data := multiqc.get_module_data(sample=s, module="Pangolin"):
summarized_data[s]["lineage"] = data["lineage"]
if data := multiqc.get_module_data(sample=s, module="Nextclade"):
summarized_data[s]["clade"] = data["clade"]
summarized_data = {
s: {
k: v for k, v in d.items() if v is not None
} for s, d in summarized_data.items()
}
summarized_data = {s: d for s, d in summarized_data.items() if d}
pprint(dict(summarized_data))
{'SAMPLE1_PE': {'input_reads': 55442, 'mean_coverage': 433.22, 'non_host_reads': 99.95856639734825}, 'SAMPLE2_PE': {'input_reads': 42962, 'mean_coverage': 343.94, 'non_host_reads': 99.78127278408499}, 'SAMPLE3_SE': {'input_reads': 49202, 'mean_coverage': 411.97, 'non_host_reads': 99.90141237489016}}
Let's show this table:
from multiqc.plots import table
plot = table.plot(
data=summarized_data,
headers=headers,
pconfig={
"id": "summary_assembly_metrics",
"title": "Summary Assembly Metrics",
},
)
plot.show()
input_reads | non_host_reads | |
---|---|---|
SAMPLE1_PE | 55442.0 | 99.958566 |
SAMPLE2_PE | 42962.0 | 99.781273 |
SAMPLE3_SE | 49202.0 | 99.901412 |
We can also display this data as a violin plot, which is a more compact representation for very wide or very tall tables.
plot.show(violin=True)
Let's add this plot into the report. We will prepend th new section to make it appear in the beginning of the report.
module = multiqc.BaseMultiqcModule(
name="nf-core/viralrecon summary",
anchor="custom_data",
)
module.add_section(
name="De novo assembly metrics",
anchor="de_novo_assembly_metrics",
description="Summary of input reads, trimmed reads, and non-host reads. Generated by the nf-core/viralrecon pipeline",
plot=plot,
)
multiqc.report.modules = [module] + multiqc.report.modules
We can write the updated report to a file. Since our new section is designed to replace general stats, we will tell MultiQC not to render the general stats table.
multiqc.write_report(
force=True,
title="nf-core/viralrecon report",
filename="multiqc_report",
exclude_modules=["general_stats"],
)
%ls
update_config | Report title: nf-core/viralrecon report
/// https://multiqc.info 🔍 v1.24.1
file_search | Excluding modules 'general_stats'
write_results | Data : multiqc_report_data
write_results | Report : multiqc_report.html
data/ multiqc_report.html data.zip multiqc_report_data/ gc_content.html notebook.html gc_content.png notebook.ipynb multiqc_config_illumina.yml
Now we have a report, we can show it inside the notebook.
import IPython
# Best if using Google Colab
# IPython.display.HTML(filename='./multiqc_report.html')
# Best if running locally
IPython.display.IFrame('./multiqc_report.html', '100%', 600)
If you want to restart the session from scratch, you can either restart the kernel, or call multiqc.reset()
multiqc.reset()
Like the command line tool, all interactive commands will load the config in the same order. Any config passed directly to a function (like module_order
or exclude_modules
that we specified above) will apply to this function call on top of any config loaded from file. You can also manually load a custom user config with multiqc.load_config()
:
multiqc.load_config("multiqc_config_illumina.yml")
config | Loading config settings from: multiqc_config_illumina.yml
/// https://multiqc.info 🔍 v1.24.1