Skip to content

MultiQC Version 1.10

Compare
Choose a tag to compare
@ewels ewels released this 08 Mar 21:23

Many thanks to everyone's patience in waiting for this release, it is much appreciated!

Update for developers: Code linting

This is a big change for MultiQC developers. I have added automated code formatting and code linting (style checks) to MultiQC. This helps to keep the MultiQC code base consistent despite having many contributors and helps me to review pull-requests without having to consider whitespace. Specifically, MultiQC now uses three main tools:

All developers must run these tools when submitting changes via Pull-Requests! Automated CI tests now run with GitHub actions to check that all files pass the above tests. If any files do not, that test will fail giving a red ❌ next to the pull request.

For further information, please see the documentation.

MultiQC updates

New MultiQC Features

  • --sample-filters now also accepts show_re and hide_re in addition to show and hide. The _re options use regex, while the "normal" options use globbing.
  • MultiQC config files now work with .yml file extension as well as .yaml
    • .yaml will take preference if both found.
  • Section comments can now also be added for General Statistics
    • section_comments: { general_stats: "My comment" }
  • New table header config option bgcols allows background colours for table cells with categorical data.
  • New table header config options cond_formatting_rules and cond_formatting_colours
    • Comparable functionality to user config options table_cond_formatting_rules and table_cond_formatting_colours,
      allowes module developers to format table cell values as labels.
  • New CI test looks for git merge markers in files
  • Beautiful new progress bar from the amazing willmcgugan/rich package.
  • Added a bunch of new default sample name trimming suffixes (see 8ac5c7b)
  • Added timeout-minutes: 10 to the CI test workflow to check that changes aren't negatively affecting run time too much.
  • New table header option bars_zero_centrepoint to treat 0 as zero width bars and plot bar length based on absolute values

New Modules

  • EigenStratDatabaseTools
    • Added MultiQC module to report SNP coverages from eigenstrat_snp_coverage.py in the general stats table.
  • HOPS
    • Post-alignment ancient DNA analysis tool for MALT
  • JCVI
    • Computes statistics on genome annotation.
  • ngsderive
    • Forensic analysis tool useful in backwards computing information from next-generation sequencing data.
  • OptiType
    • Precision HLA typing from next-generation sequencing data
  • PURPLE
    • A purity, ploidy and copy number estimator for whole genome tumor data
  • Pychopper
    • Identify, orient and trim full length Nanopore cDNA reads
  • qc3C
    • Reference-free QC of Hi-C sequencing data
  • Sentieon
    • Submodules added to catch Picard-based QC metrics files

Module updates

  • DRAGEN
    • Fix issue where missing out fields could crash the module (#1223)
    • Added support for whole-exome / targetted data (#1290)
  • featureCounts
  • fgbio
    • Fix ErrorRateByReadPosition to calculate ymax not just on the overall error_rate, but also specific base errors (ex. a_to_c_error_rate, a_to_g_error_rate, ...). (#1215)
    • Fix ErrorRateByReadPosition plotted line names to no longer concatenate multiple read identifiers and no longer have off-by-one read numbering (ex. Sample1_R2_R3 -> Sample1_R2) ([#1304)
  • Fastp
    • Fixed description for duplication rate (pre-filtering, not post) ([#1313)
  • GATK
    • Add support for the creation of a "Reported vs Empirical Quality" graph to the Base Recalibration module.
  • hap.py
    • Updated module to plot both SNP and INDEL stats (#1241)
  • indexcov
    • Fixed bug when making the PED file plots (#1265)
  • interop
    • Added the % Occupied metric to Read Metrics per Lane table which is reported for NovaSeq and iSeq platforms.
  • Kaiju
    • Fixed bug affecting inputs with taxa levels other than Phylum (#1217)
    • Rework barplot, add top 5 taxons (#1219)
  • Kraken
    • Fix ZeroDivisionError (#1276)
    • Add distinct minimizer heatmap for KrakenUniq style duplication information (#1333)
  • MALT
    • Fix y-axis labelling in bargraphs
  • MACS2
    • Add number of peaks to the General Statistics table.
  • mosdepth
    • Enable prepending of directory to sample names
    • Display contig names in Coverage per contig plot tooltip
  • Picard
    • Fix HsMetrics bait percentage columns (#1212)
    • Fix ConvertSequencingArtifactToOxoG files not being found (#1310)
    • Make WgsMetrics histogram smoothed if more than 1000 data points (avoids huge plots that crash the browser)
    • Multiple new config options for WgsMetrics to customise coverage histogram and speed up MultiQC with very high coverage files.
    • Add additional datasets to Picard Alignment Summary (#1293)
    • Add support for CrosscheckFingerprints (#1327)
  • PycoQC
    • Log10 x-axis for Read Length plot (#1214)
  • Rockhopper
    • Fix issue with parsing genome names in Rockhopper summary files (#1333)
    • Fix issue properly parsing multiple samples within a single Rockhopper summary file
  • Salmon
    • Only try to generate a plot for fragment length if the data was found.
  • verifyBamID
    • Fix CHIP value detection (#1316).

New Custom Content features

  • General Stats custom content now gives a log message
  • If id is not set in JSON or YAML files, it defaults to the sample name instead of just custom_content
  • Data from JSON or YAML now has data keys (sample names) run through the clean_s_name() function to apply sample name cleanup
  • Fixed minor bug which caused custom content YAML files with a string data type to not be parsed

Bug Fixes

  • Disable preservation of timestamps / modes when copying temp report files, to help issues with network shares (#1333)
  • Fixed MatPlotLib warning: FixedFormatter should only be used together with FixedLocator
  • Fixed long-standing min/max bug with shared minimum values for table columns using shared_key
  • Made table colour schemes work with negative numbers (don't strip - from values when making scheme)