<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0" xml:lang="en">
  <teiHeader>
    <fileDesc>
      <titleStmt>
        <title>MultiQC: summarize analysis results for multiple tools and samples in a single report</title>
        <author>Philip Ewels</author>
        <author>Måns Magnusson</author>
        <author>Sverker Lundin</author>
        <author>Max Käller</author>
      </titleStmt>
      <publicationStmt>
        <p>Tag layer of the DHSS Meta-Tagging Project. The article text is reproduced from the
           staged copy named in sourceDesc and is not altered; the tags are held separately in
           standOff so that overlapping and nested spans are preserved.</p>
      </publicationStmt>
      <sourceDesc>
        <bibl>
          <title>MultiQC: summarize analysis results for multiple tools and samples in a single report</title>
          <date>2016</date>
          <publisher>Bioinformatics</publisher>
          <idno type="DOI">10.1093/bioinformatics/btw354</idno>
          
          <idno type="record">ewels2016-multiqc-analysis-results</idno>
          <note type="staged-file">ewels2016-multiqc-analysis-results.txt, the project's staged copy</note>
          <note type="text-sha1">d0813407d8d1543dc43f58a590d19629d165ac51</note>
          <note type="rights">cc-by</note>
        </bibl>
      </sourceDesc>
    </fileDesc>
    <profileDesc>
      <textClass><keywords><term>bioinformatics</term></keywords></textClass>
      <particDesc>
        <person xml:id="paper"><p>the paper's own words</p></person>
        <person xml:id="tagger"><p>the tag layer; a sentence written by the tagger about the
          paper, always anchored to a quotation but not itself a quotation</p></person>
      </particDesc>
    </profileDesc>
    <revisionDesc>
      <change when="2026-10-06"
              who="build_paper_edition.py">131 spans located by searching the stored text for the quote's exact words, allowing any whitespace between them</change>
    </revisionDesc>
  </teiHeader>
  <standOff>
    <spanGrp type="tags">
      <span xml:id="t0" from="#a1" to="#a2" type="object_of_study" ana="#object_of_study" resp="#paper">cross-tool and cross-sample integration and visualization of next-generation-sequencing quality-control results</span>
      <span xml:id="t1" from="#a7" to="#a8" type="research_question" ana="#research_question" resp="#paper">how to replace repetitive per-sample QC compilation with an extensible summary that exposes global trends, outliers, biases, and batch effects</span>
      <span xml:id="t2" from="#a3" to="#a4" type="contribution" ana="#contribution" resp="#paper">MultiQC, a directory-scanning modular tool that parses many analysis logs into a single interactive report and reusable data exports</span>
      <span xml:id="t3" from="#a3" to="#a4" type="claim_type" ana="#claim_type" resp="#paper">method</span>
      <span xml:id="t4" from="#a9" to="#a10" type="phenomenon" ana="#phenomenon" resp="#paper">quality-control visibility, batch-effect detection, outlier detection, reporting effort, extensibility, and scaling across many sequencing samples</span>
      <span xml:id="t5" from="#a11" to="#a12" type="method" ana="#method" resp="#paper">system-or-tool-building<term>system-or-tool-building</term></span>
      <span xml:id="t6" from="#a11" to="#a12" type="mechanisms" ana="#mechanisms[0]" resp="#tagger" cert="0.95">Specified directories are recursively scanned for recognized output files.<term>recursive directory search</term></span>
      <span xml:id="t7" from="#a11" to="#a12" type="mechanisms" ana="#mechanisms[1]" resp="#tagger" cert="0.95">Each supported-tool parser queries configurable patterns and contributes only when logs exist.<term>tool submodules</term></span>
      <span xml:id="t8" from="#a11" to="#a12" type="mechanisms" ana="#mechanisms[2]" resp="#tagger" cert="0.95">A loaded template is parsed to render the final report.<term>Jinja2</term></span>
      <span xml:id="t9" from="#a11" to="#a12" type="mechanisms" ana="#mechanisms[3]" resp="#tagger" cert="0.95">Parsed data are exported for downstream processing.<term>tab delimited text, YAML or JSON</term></span>
      <span xml:id="t10" from="#a9" to="#a10" type="mechanisms" ana="#mechanisms[4]" resp="#tagger" cert="0.95">Aligned sample visualizations expose differences hidden across separate files.<term>shared plots</term></span>
      <span xml:id="t11" from="#a13" to="#a14" type="mechanisms" ana="#mechanisms[5]" resp="#tagger" cert="0.95">Browser-side rendering provides resizeable, interactive, zoomable plots.<term>HighCharts</term></span>
      <span xml:id="t12" from="#a15" to="#a16" type="mechanisms" ana="#mechanisms[6]" resp="#tagger" cert="0.95">Large reports use runtime-rendered static images to keep the standalone file manageable.<term>MatPlotLib</term></span>
      <span xml:id="t13" from="#a13" to="#a14" type="mechanisms" ana="#mechanisms[7]" resp="#tagger" cert="0.95">Sample renaming, hiding, and highlighting support focused inspection.<term>report toolbox</term></span>
      <span xml:id="t14" from="#a17" to="#a18" type="mechanisms" ana="#mechanisms[8]" resp="#tagger" cert="0.95">External plugins access and modify internal functionality.<term>code hooks</term></span>
      <span xml:id="t15" from="#a17" to="#a18" type="mechanisms" ana="#mechanisms[9]" resp="#tagger" cert="0.95">Independent modules and templates execute as part of the main program.<term>setuptools entry points</term></span>
      <span xml:id="t16" from="#a25" to="#a26" type="mechanisms" ana="#mechanisms[10]" resp="#tagger" cert="0.95">Facility metadata enter reports and parsed summaries flow into a database.<term>MultiQC_NGI plugin</term></span>
      <span xml:id="t17" from="#a25" to="#a26" type="mechanisms" ana="#mechanisms[11]" resp="#tagger" cert="0.95">Branding and self-contained output support delivery reports.<term>templates</term></span>
      <span xml:id="t18" from="#a7" to="#a8" type="limitations" ana="#limitations[0]" resp="#tagger" cert="0.95">Existing QC logs and reports are predominantly per-sample and require manual project-wide compilation.</span>
      <span xml:id="t19" from="#a5" to="#a6" type="limitations" ana="#limitations[1]" resp="#tagger" cert="0.95">Expanding sample counts increase vulnerability to subtle confounding batch effects.</span>
      <span xml:id="t20" from="#a9" to="#a10" type="limitations" ana="#limitations[2]" resp="#tagger" cert="0.95">Per-sample switching can conceal subtle differences, outliers, and batch effects.</span>
      <span xml:id="t21" from="#a15" to="#a16" type="limitations" ana="#limitations[3]" resp="#tagger" cert="0.95">HighCharts becomes impractical for reports containing hundreds of samples.</span>
      <span xml:id="t22" from="#a15" to="#a16" type="limitations" ana="#limitations[4]" resp="#tagger" cert="0.95">Static large-sample reports sacrifice browser interactivity for consistent standalone size.</span>
      <span xml:id="t23" from="#a17" to="#a18" type="limitations" ana="#limitations[5]" resp="#tagger" cert="0.95">Research groups may require bespoke parsers and customization beyond built-in tools.</span>
      <span xml:id="t24" from="#a11" to="#a12" type="limitations" ana="#limitations[6]" resp="#tagger" cert="0.95">Routine value depends on the recognized logs produced by upstream tools.</span>
      <span xml:id="t25" from="#a19" to="#a20" type="limitations" ana="#limitations[7]" resp="#tagger" cert="0.95">The paper reports adoption and applications but no controlled comparison of error detection against manual review.</span>
      <span xml:id="t26" from="#a1" to="#a2" type="concepts" ana="#concepts[0]" resp="#paper" cert="0.95">quality control<term>quality control</term></span>
      <span xml:id="t27" from="#a1" to="#a2" type="concepts" ana="#concepts[1]" resp="#paper" cert="0.95">next-generation sequencing data<term>next-generation sequencing data</term></span>
      <span xml:id="t28" from="#a1" to="#a2" type="concepts" ana="#concepts[2]" resp="#paper" cert="0.95">QC metrics<term>QC metrics</term></span>
      <span xml:id="t29" from="#a1" to="#a2" type="concepts" ana="#concepts[3]" resp="#paper" cert="0.95">analysis results<term>analysis results</term></span>
      <span xml:id="t30" from="#a1" to="#a2" type="concepts" ana="#concepts[4]" resp="#paper" cert="0.95">batch effects<term>batch effects</term></span>
      <span xml:id="t31" from="#a1" to="#a2" type="concepts" ana="#concepts[5]" resp="#paper" cert="0.95">outlier samples<term>outlier samples</term></span>
      <span xml:id="t32" from="#a3" to="#a4" type="concepts" ana="#concepts[6]" resp="#paper" cert="0.95">MultiQC<term>MultiQC</term></span>
      <span xml:id="t33" from="#a3" to="#a4" type="concepts" ana="#concepts[7]" resp="#paper" cert="0.95">tool<term>tool</term></span>
      <span xml:id="t34" from="#a3" to="#a4" type="concepts" ana="#concepts[8]" resp="#paper" cert="0.95">single report<term>single report</term></span>
      <span xml:id="t35" from="#a3" to="#a4" type="concepts" ana="#concepts[9]" resp="#paper" cert="0.95">global trends<term>global trends</term></span>
      <span xml:id="t36" from="#a7" to="#a8" type="concepts" ana="#concepts[10]" resp="#paper" cert="0.95">logs<term>logs</term></span>
      <span xml:id="t37" from="#a7" to="#a8" type="concepts" ana="#concepts[11]" resp="#paper" cert="0.95">reports<term>reports</term></span>
      <span xml:id="t38" from="#a9" to="#a10" type="concepts" ana="#concepts[12]" resp="#paper" cert="0.95">shared plots<term>shared plots</term></span>
      <span xml:id="t39" from="#a9" to="#a10" type="concepts" ana="#concepts[13]" resp="#paper" cert="0.95">confounding factors<term>confounding factors</term></span>
      <span xml:id="t40" from="#a9" to="#a10" type="concepts" ana="#concepts[14]" resp="#paper" cert="0.95">custom comparative scripts<term>custom comparative scripts</term></span>
      <span xml:id="t41" from="#a11" to="#a12" type="concepts" ana="#concepts[15]" resp="#paper" cert="0.95">recognized files<term>recognized files</term></span>
      <span xml:id="t42" from="#a11" to="#a12" type="concepts" ana="#concepts[16]" resp="#paper" cert="0.95">Submodules<term>Submodules</term></span>
      <span xml:id="t43" from="#a11" to="#a12" type="concepts" ana="#concepts[17]" resp="#paper" cert="0.95">template<term>template</term></span>
      <span xml:id="t44" from="#a11" to="#a12" type="concepts" ana="#concepts[18]" resp="#paper" cert="0.95">Jinja2 package<term>Jinja2 package</term></span>
      <span xml:id="t45" from="#a11" to="#a12" type="concepts" ana="#concepts[19]" resp="#paper" cert="0.95">parsed data<term>parsed data</term></span>
      <span xml:id="t46" from="#a13" to="#a14" type="concepts" ana="#concepts[20]" resp="#paper" cert="0.95">HTML report<term>HTML report</term></span>
      <span xml:id="t47" from="#a13" to="#a14" type="concepts" ana="#concepts[21]" resp="#paper" cert="0.95">HighCharts<term>HighCharts</term></span>
      <span xml:id="t48" from="#a13" to="#a14" type="concepts" ana="#concepts[22]" resp="#paper" cert="0.95">report toolbox<term>report toolbox</term></span>
      <span xml:id="t49" from="#a15" to="#a16" type="concepts" ana="#concepts[23]" resp="#paper" cert="0.95">MatPlotLib<term>MatPlotLib</term></span>
      <span xml:id="t50" from="#a15" to="#a16" type="concepts" ana="#concepts[24]" resp="#paper" cert="0.95">static reports<term>static reports</term></span>
      <span xml:id="t51" from="#a17" to="#a18" type="concepts" ana="#concepts[25]" resp="#paper" cert="0.95">custom code<term>custom code</term></span>
      <span xml:id="t52" from="#a17" to="#a18" type="concepts" ana="#concepts[26]" resp="#paper" cert="0.95">Code hooks<term>Code hooks</term></span>
      <span xml:id="t53" from="#a17" to="#a18" type="concepts" ana="#concepts[27]" resp="#paper" cert="0.95">external plugins<term>external plugins</term></span>
      <span xml:id="t54" from="#a17" to="#a18" type="concepts" ana="#concepts[28]" resp="#paper" cert="0.95">setuptools entry points<term>setuptools entry points</term></span>
      <span xml:id="t55" from="#a17" to="#a18" type="concepts" ana="#concepts[29]" resp="#paper" cert="0.95">modules<term>modules</term></span>
      <span xml:id="t56" from="#a21" to="#a22" type="concepts" ana="#concepts[30]" resp="#paper" cert="0.95">single cell<term>single cell</term></span>
      <span xml:id="t57" from="#a21" to="#a22" type="concepts" ana="#concepts[31]" resp="#paper" cert="0.95">population studies<term>population studies</term></span>
      <span xml:id="t58" from="#a21" to="#a22" type="concepts" ana="#concepts[32]" resp="#paper" cert="0.95">post-processing<term>post-processing</term></span>
      <span xml:id="t59" from="#a21" to="#a22" type="concepts" ana="#concepts[33]" resp="#paper" cert="0.95">dataset filtering<term>dataset filtering</term></span>
      <span xml:id="t60" from="#a23" to="#a24" type="concepts" ana="#concepts[34]" resp="#paper" cert="0.95">sequencing facility<term>sequencing facility</term></span>
      <span xml:id="t61" from="#a25" to="#a26" type="concepts" ana="#concepts[35]" resp="#paper" cert="0.95">MultiQC_NGI plugin<term>MultiQC_NGI plugin</term></span>
      <span xml:id="t62" from="#a25" to="#a26" type="concepts" ana="#concepts[36]" resp="#paper" cert="0.95">LIMS<term>LIMS</term></span>
      <span xml:id="t63" from="#a27" to="#a28" type="concepts" ana="#concepts[37]" resp="#paper" cert="0.95">central collection point<term>central collection point</term></span>
      <span xml:id="t64" from="#a27" to="#a28" type="concepts" ana="#concepts[38]" resp="#paper" cert="0.95">analysis pipelines<term>analysis pipelines</term></span>
      <span xml:id="t65" from="#a5" to="#a6" type="concepts" ana="#concepts[39]" resp="#paper" cert="0.95">sample numbers<term>sample numbers</term></span>
      <span xml:id="t66" from="#a27" to="#a28" type="concepts" ana="#concepts[40]" resp="#paper" cert="0.95">Extension<term>Extension</term></span>
      <span xml:id="t67" from="#a5" to="#a6" type="concepts" ana="#concepts[41]" resp="#paper" cert="0.95">Advances in next-generation sequencing<term>Advances in next-generation sequencing</term></span>
      <span xml:id="t68" from="#a5" to="#a6" type="concepts" ana="#concepts[42]" resp="#paper" cert="0.95">avalanche of data<term>avalanche of data</term></span>
      <span xml:id="t69" from="#a3" to="#a4" type="unhoused_relations" ana="#unhoused_relations[0]" resp="#tagger" cert="0.95">MultiQC → tool<note>MultiQC is introduced appositively as a tool for integrated reporting.</note></span>
      <span xml:id="t70" from="#a15" to="#a16" type="unhoused_relations" ana="#unhoused_relations[1]" resp="#tagger" cert="0.95">HighCharts → MatPlotLib<note>Large reports switch from HighCharts to MatPlotLib image rendering.</note></span>
      <span xml:id="t71" from="#a3" to="#a4" type="unhoused_relations" ana="#unhoused_relations[2]" resp="#tagger" cert="0.95">single report → global trends<note>A single integrated report enables rapid identification of global trends and biases.</note></span>
      <span xml:id="t72" from="#a9" to="#a10" type="unhoused_relations" ana="#unhoused_relations[3]" resp="#tagger" cert="0.95">shared plots → batch effects<note>Shared cross-sample plots aid detection of subtle batch effects.</note></span>
      <span xml:id="t73" from="#a9" to="#a10" type="unhoused_relations" ana="#unhoused_relations[4]" resp="#tagger" cert="0.95">MultiQC → custom comparative scripts<note>MultiQC removes the need for custom cross-sample comparison scripts.</note></span>
      <span xml:id="t74" from="#a5" to="#a6" type="unhoused_relations" ana="#unhoused_relations[5]" resp="#tagger" cert="0.95">sample numbers → batch effects<note>Growing sample sets increase vulnerability to confounding batch effects.</note></span>
      <span xml:id="t75" from="#a11" to="#a12" type="unhoused_relations" ana="#unhoused_relations[6]" resp="#tagger" cert="0.95">Submodules → recognized files<note>Each submodule parses only when recognized logs are found.</note></span>
      <span xml:id="t76" from="#a11" to="#a12" type="unhoused_relations" ana="#unhoused_relations[7]" resp="#tagger" cert="0.95">template → HTML report<note>Jinja2 parses a selected template to render the report.</note></span>
      <span xml:id="t77" from="#a15" to="#a16" type="unhoused_relations" ana="#unhoused_relations[8]" resp="#tagger" cert="0.95">MatPlotLib → static reports<note>MatPlotLib produces embedded images when interactive rendering becomes too large.</note></span>
      <span xml:id="t78" from="#a17" to="#a18" type="unhoused_relations" ana="#unhoused_relations[9]" resp="#tagger" cert="0.95">Code hooks → external plugins<note>Code hooks allow external plugins to modify MultiQC internals.</note></span>
      <span xml:id="t79" from="#a21" to="#a22" type="unhoused_relations" ana="#unhoused_relations[10]" resp="#tagger" cert="0.95">parsed data → post-processing<note>Saved parsed data can be used for post-processing and filtering.</note></span>
      <span xml:id="t80" from="#a25" to="#a26" type="unhoused_relations" ana="#unhoused_relations[11]" resp="#tagger" cert="0.95">MultiQC_NGI plugin → LIMS<note>The plugin inserts LIMS metadata into reports and stores summaries in a database.</note></span>
      <span xml:id="t81" from="#a27" to="#a28" type="unhoused_relations" ana="#unhoused_relations[12]" resp="#tagger" cert="0.95">Extension → central collection point<note>Extension and export let MultiQC function as a pipeline-end collection point.</note></span>
      <span xml:id="t82" from="#a27" to="#a28" type="unhoused_relations" ana="#unhoused_relations[13]" resp="#tagger" cert="0.95">MultiQC → batch effects<note>Routine early use can reduce downstream risk from batch effects.</note></span>
      <span xml:id="t83" from="#a9" to="#a10" type="senses" ana="#senses[0]" resp="#tagger" cert="0.95">quality control as project-wide comparison rather than isolated per-sample inspection</span>
      <span xml:id="t84" from="#a9" to="#a10" type="senses" ana="#senses[1]" resp="#tagger" cert="0.95">batch effect as a subtle confound exposed through shared visualization</span>
      <span xml:id="t85" from="#a11" to="#a12" type="senses" ana="#senses[2]" resp="#tagger" cert="0.95">single report as an integrated visualization plus reusable data export</span>
      <span xml:id="t86" from="#a11" to="#a12" type="senses" ana="#senses[3]" resp="#tagger" cert="0.95">submodule as a conditional parser that is silent when its logs are absent</span>
      <span xml:id="t87" from="#a15" to="#a16" type="senses" ana="#senses[4]" resp="#tagger" cert="0.95">self-contained report as a portable file with embedded plots</span>
      <span xml:id="t88" from="#a17" to="#a18" type="senses" ana="#senses[5]" resp="#tagger" cert="0.95">extension as separately maintained code executing inside the main program</span>
      <span xml:id="t89" from="#a21" to="#a22" type="senses" ana="#senses[6]" resp="#tagger" cert="0.95">large-project QC as rapid detection of abnormal samples across thousands of inputs</span>
      <span xml:id="t90" from="#a27" to="#a28" type="senses" ana="#senses[7]" resp="#tagger" cert="0.95">central collection point as the reporting terminus of an analysis pipeline</span>
      <span xml:id="t91" from="#a7" to="#a8" type="claim_relations" ana="#claim_relations[0]" resp="#tagger" cert="0.95">builds-on → per-tool logs and QC reports<note>note: MultiQC consumes outputs of established analysis and QC tools.</note></span>
      <span xml:id="t92" from="#a9" to="#a10" type="claim_relations" ana="#claim_relations[1]" resp="#tagger" cert="0.95">contrasts-with → manual per-sample result compilation<note>note: One cross-sample report replaces repeated switching and compilation.</note></span>
      <span xml:id="t93" from="#a27" to="#a28" type="claim_relations" ana="#claim_relations[2]" resp="#tagger" cert="0.95">extends → existing bioinformatics analysis pipelines<note>note: MultiQC adds an extensible reporting terminus and data export.</note></span>
      <span xml:id="t94" from="#a9" to="#a10" type="claim_relations" ana="#claim_relations[3]" resp="#tagger" cert="0.95">contrasts-with → custom comparative scripts<note>note: The common report removes the need for bespoke comparison code.</note></span>
      <span xml:id="t95" from="#a5" to="#a6" type="concept_edges" ana="#concept_edges[0]" resp="#tagger" cert="0.95">Advances in next-generation sequencing —causes→ avalanche of data<note>direction on the measure: increases · the relation itself is separately evidenced · strength of the relation: 0.95 · note: Direct flat effect statement. · the relation stated: Advances in next-generation sequencing are leading to an avalanche of data.</note><term>Advances in next-generation sequencing</term><term>avalanche of data</term></span>
      <span xml:id="t96" from="#a7" to="#a8" type="content_tags" ana="#content_tags.findings[0]" resp="#tagger" cert="0.95">Per-sample QC logs make project-wide assessment slow, repetitive, complex, and error prone.</span>
      <span xml:id="t97" from="#a3" to="#a4" type="content_tags" ana="#content_tags.findings[1]" resp="#tagger" cert="0.95">MultiQC creates one report from multiple tools and many samples so global trends and biases can be identified quickly.</span>
      <span xml:id="t98" from="#a9" to="#a10" type="content_tags" ana="#content_tags.findings[2]" resp="#tagger" cert="0.95">Shared plots expose subtle sample differences that are difficult to see by switching among files.</span>
      <span xml:id="t99" from="#a9" to="#a10" type="content_tags" ana="#content_tags.findings[3]" resp="#tagger" cert="0.95">Central visualization supports batch-effect detection and reduces the chance that confounders affect downstream results.</span>
      <span xml:id="t100" from="#a11" to="#a12" type="content_tags" ana="#content_tags.findings[4]" resp="#tagger" cert="0.95">The same command works across analysis types because submodules contribute only when matching logs are found.</span>
      <span xml:id="t101" from="#a11" to="#a12" type="content_tags" ana="#content_tags.findings[5]" resp="#tagger" cert="0.95">At publication MultiQC supported 22 aligners, processing tools, and QC programs.</span>
      <span xml:id="t102" from="#a13" to="#a14" type="content_tags" ana="#content_tags.findings[6]" resp="#tagger" cert="0.95">The report is a shareable self-contained HTML file with interactive, exportable plots.</span>
      <span xml:id="t103" from="#a15" to="#a16" type="content_tags" ana="#content_tags.findings[7]" resp="#tagger" cert="0.95">For hundreds of samples MultiQC switches from browser plotting to embedded MatPlotLib images.</span>
      <span xml:id="t104" from="#a17" to="#a18" type="content_tags" ana="#content_tags.findings[8]" resp="#tagger" cert="0.95">Modules, templates, and plugins can remain in separate code bases while executing within MultiQC.</span>
      <span xml:id="t105" from="#a19" to="#a20" type="content_tags" ana="#content_tags.findings[9]" resp="#tagger" cert="0.95">Users had contributed four modules and at least three research groups had written plugins by publication.</span>
      <span xml:id="t106" from="#a19" to="#a20" type="content_tags" ana="#content_tags.findings[10]" resp="#tagger" cert="0.95">MultiQC had already been downloaded thousands of times and integrated into bcbio-nextgen.</span>
      <span xml:id="t107" from="#a21" to="#a22" type="content_tags" ana="#content_tags.findings[11]" resp="#tagger" cert="0.95">MultiQC parses thousands of samples within minutes and makes abnormal samples easy to identify.</span>
      <span xml:id="t108" from="#a23" to="#a24" type="content_tags" ana="#content_tags.findings[12]" resp="#tagger" cert="0.95">Sequencing-facility reports expose failing samples and irregular sample groups.</span>
      <span xml:id="t109" from="#a25" to="#a26" type="content_tags" ana="#content_tags.findings[13]" resp="#tagger" cert="0.95">The MultiQC_NGI plugin links LIMS metadata and stores parsed summaries in an internal database.</span>
      <span xml:id="t110" from="#a27" to="#a28" type="content_tags" ana="#content_tags.findings[14]" resp="#tagger" cert="0.95">Extension and data export let MultiQC serve as a central collection point at the end of analysis pipelines.</span>
      <span xml:id="t111" from="#a3" to="#a4" type="content_tags" ana="#content_tags.definitions[0]" resp="#tagger" cert="0.95">a tool that summarizes outputs from multiple tools and samples in one report<term>MultiQC</term></span>
      <span xml:id="t112" from="#a11" to="#a12" type="content_tags" ana="#content_tags.definitions[1]" resp="#tagger" cert="0.95">a supported-tool component that searches for and parses recognized logs<term>submodule</term></span>
      <span xml:id="t113" from="#a13" to="#a14" type="content_tags" ana="#content_tags.definitions[2]" resp="#tagger" cert="0.95">a self-contained HTML artifact combining statistics and visualizations across samples<term>report</term></span>
      <span xml:id="t114" from="#a17" to="#a18" type="content_tags" ana="#content_tags.definitions[3]" resp="#tagger" cert="0.95">an extension point through which external plugins modify program internals<term>code hook</term></span>
      <span xml:id="t115" from="#a17" to="#a18" type="content_tags" ana="#content_tags.definitions[4]" resp="#tagger" cert="0.95">a separately distributable presentation component used to render or brand reports<term>template</term></span>
      <span xml:id="t116" from="#a17" to="#a18" type="content_tags" ana="#content_tags.definitions[5]" resp="#tagger" cert="0.95">external code integrated with MultiQC functionality through hooks and entry points<term>plugin</term></span>
      <span xml:id="t117" from="#a5" to="#a6" type="content_tags" ana="#content_tags.definitions[6]" resp="#tagger" cert="0.95">subtle confounding differences across expanding sample sets<term>batch effects</term></span>
      <span xml:id="t118" from="#a27" to="#a28" type="content_tags" ana="#content_tags.definitions[7]" resp="#tagger" cert="0.95">the pipeline terminus where analysis metadata are integrated and exported<term>central collection point</term></span>
      <span xml:id="t119" from="#a11" to="#a12" type="content_tags" ana="#content_tags.quantities[0]" resp="#tagger" cert="0.95">22 — common bioinformatics tools supported at publication</span>
      <span xml:id="t120" from="#a15" to="#a16" type="content_tags" ana="#content_tags.quantities[1]" resp="#tagger" cert="0.95">hundreds of samples — report scale that triggers static image rendering</span>
      <span xml:id="t121" from="#a19" to="#a20" type="content_tags" ana="#content_tags.quantities[2]" resp="#tagger" cert="0.95">four — new modules contributed by users</span>
      <span xml:id="t122" from="#a19" to="#a20" type="content_tags" ana="#content_tags.quantities[3]" resp="#tagger" cert="0.95">at least three — research groups known to have written plugins</span>
      <span xml:id="t123" from="#a19" to="#a20" type="content_tags" ana="#content_tags.quantities[4]" resp="#tagger" cert="0.95">thousands of times — downloads during the first months</span>
      <span xml:id="t124" from="#a21" to="#a22" type="content_tags" ana="#content_tags.quantities[5]" resp="#tagger" cert="0.95">thousands of samples within minutes — reported large-project parsing capacity</span>
      <span xml:id="t125" from="#a5" to="#a6" type="content_tags" ana="#content_tags.variables[0]" resp="#tagger" cert="0.95">sample numbers<term>sample numbers</term></span>
      <span xml:id="t126" from="#a9" to="#a10" type="content_tags" ana="#content_tags.variables[1]" resp="#tagger" cert="0.95">batch effects<term>batch effects</term></span>
      <span xml:id="t127" from="#a1" to="#a2" type="content_tags" ana="#content_tags.variables[2]" resp="#tagger" cert="0.95">outlier samples<term>outlier samples</term></span>
      <span xml:id="t128" from="#a9" to="#a10" type="content_tags" ana="#content_tags.variables[3]" resp="#tagger" cert="0.95">key statistics<term>key statistics</term></span>
      <span xml:id="t129" from="#a11" to="#a12" type="content_tags" ana="#content_tags.variables[4]" resp="#tagger" cert="0.95">analysis type<term>analysis type</term></span>
      <span xml:id="t130" from="#a21" to="#a22" type="content_tags" ana="#content_tags.variables[6]" resp="#tagger" cert="0.95">parsed data<term>parsed data</term></span>
    </spanGrp>
  </standOff>
  <text>
    <body>
        <p><anchor xml:id="a0"/> MultiQC: summarize analysis results for multiple tools and samples in a single report</p>
        <p>Abstract</p>
        <p><anchor xml:id="a1"/>Motivation: Fast and accurate quality control is essential for studies involving next-generation sequencing data. Whilst numerous tools exist to quantify QC metrics, there is no common approach to flexibly integrate these across tools and large sample sets. Assessing analysis results across an entire project can be time consuming and error prone; batch effects and outlier samples can easily be missed in the early stages of analysis.<anchor xml:id="a2"/></p>
        <p>Results: <anchor xml:id="a3"/>We present MultiQC, a tool to create a single report visualising output from multiple tools across many samples, enabling global trends and biases to be quickly identified. MultiQC can plot data from many common bioinformatics tools and is built to allow easy extension and customization.<anchor xml:id="a4"/></p>
        <p>Availability and implementation: MultiQC is available with an GNU GPLv3 license on GitHub, the Python Package Index and Bioconda. Documentation and example reports are available at http://multiqc.info</p>
        <p>Contact: phil.ewels@scilifelab.se</p>
        <p>1 Introduction</p>
        <p><anchor xml:id="a5"/>Advances in next-generation sequencing are leading to an avalanche of data. Whilst opening doors to new analysis types and experimental designs, expanding sample numbers make studies increasingly vulnerable to confounding batch effects ( Leek et al., 2010 ; Meyer and Liu 2014 ; Taub et al., 2010 ). Such biases are often subtle and difficult to detect and require careful quality control measures.<anchor xml:id="a6"/></p>
        <p><anchor xml:id="a7"/>Most bioinformatics programs produce logs detailing their results. Dedicated QC tools such as FastQC ( http://www.bioinformatics.babraham.ac.uk/projects/fastqc ), Qualimap ( Okonechnikov et al. , 2015 ) and RSeQC ( Wang et al. , 2012 ) are excellent at highlighting potential problems in data. However, nearly all of these logs and reports are produced on a per-sample basis, requiring the user to find and compile QC results. This process is time consuming, repetitive and complex, making it prone to errors.<anchor xml:id="a8"/></p>
        <p><anchor xml:id="a9"/>MultiQC addresses this problem by scanning given analysis directories for log files and QC reports, creating a single summary report visualizing results across all samples. Collecting data within a single report provides a fast way to scan key statistics quickly and easily ( Fig. 1 ). Shared plots allow accurate comparison between samples, allowing detection of subtle differences not noticeable when switching between different files. Data visualization aids batch effect detection and minimizes the risk of confounding factors affecting the results of the study. MultiQC is the first tool of its type within the field; it has the potential to greatly improve quality control and reporting for researchers involved in next-generation sequencing, removing the need for custom comparative scripts.<anchor xml:id="a10"/></p>
        <p>Top of a typical MultiQC report. The general statistics table can be seen with metrics from a number of different tools gathered for each sample (Color version of this figure is available at Bioinformatics online.)</p>
        <p>2 Materials and methods</p>
        <p>2.1 Running MultiQC</p>
        <p><anchor xml:id="a11"/>MultiQC is written in Python and run on the command line; specified directories are searched recursively for any recognized files. Submodules for each supported tool are run, querying input files using configurable search settings. If any log files are found they are parsed, otherwise the module exits silently. Once all submodules have finished, the specified template is loaded and parsed using the Jinja2 package to render the final report. Parsed data is saved as tab delimited text, YAML or JSON for downstream use. Because submodules only contribute to the report if they find logs, MultiQC is run in the same way for every analysis type. At the time of writing, MultiQC supports 22 common bioinformatics tools including aligners, processing tools and QC programs.<anchor xml:id="a12"/></p>
        <p>2.2 MultiQC reports</p>
        <p><anchor xml:id="a13"/>MultiQC generates a single s elf-contained HTML report which can be shared and opened in any modern web browser. Reports render plots using the JavaScript plotting library HighCharts ( http://www.highcharts.com ). Plots are resizeable and interactive, some with click and drag zooming. Samples can be renamed, hidden and highlighted using a report toolbox. Plots can be exported in a range of publication-ready formats.<anchor xml:id="a14"/></p>
        <p><anchor xml:id="a15"/>Reports with hundreds of samples become too large for use with HighCharts; instead MultiQC switches to rendering plots as images at run-time using the Python plotting library MatPlotLib ( Hunter, 2007) . Images are embedded within the HTML, maintaining a stand-alone file with consistent file size. These static reports are also suitable for conversion to PDF using tools such as Pandoc ( http://pandoc.org ).<anchor xml:id="a16"/></p>
        <p>Each report contains an interactive walk through of features. Tutorial videos can be found at http://multiqc.info along with tutorials and documentation describing installation, usage and troubleshooting.</p>
        <p>2.3 Extending MultiQC</p>
        <p><anchor xml:id="a17"/>MultiQC supports a lot of common bioinformatics tools but it is inevitable that research groups may have their own bespoke scripts or require other customization. To accommodate this, MultiQC is built in such a way that custom code can be tied into its functionality easily. Code hooks allow external plugins to access and modify the internal workings of the program. The use of Python setuptools entry points allows modules, templates and plugins to be kept within a separate code base, whilst still executing as part of the main MultiQC program.<anchor xml:id="a18"/></p>
        <p><anchor xml:id="a19"/>Extensive documentation makes adding to MultiQC simple; four new modules have been contributed by users to date and we are aware of at least three plugins written by different research groups. Adoption by the bioinformatics community has been rapid: MultiQC has been downloaded thousands of times within the past few months and is already integrated as standard within the popular bcbio-nextgen analysis toolkit ( http://bcb.io ).<anchor xml:id="a20"/></p>
        <p>3 Typical applications</p>
        <p>3.1 Single cell data and population studies</p>
        <p><anchor xml:id="a21"/>Single cell and population studies are perhaps the perfect examples of large projects where accurate quality control of numerous datasets is critical. MultiQC is able to parse data for thousands of samples within minutes, adapting report output as required. Parsed data saved by MultiQC can be used for post-processing and dataset filtering. Reports reveal overall analysis success and make it easy to identify abnormal samples.<anchor xml:id="a22"/></p>
        <p>3.2 Sequencing facilities</p>
        <p><anchor xml:id="a23"/>MultiQC was originally developed for use in a high throughput sequencing facility. Reports give the overview required to spot failing samples and highlighting helps to identify groups of samples behaving in an irregular manner.<anchor xml:id="a24"/></p>
        <p><anchor xml:id="a25"/>Plugins allow integration with in-house systems: we have written the MultiQC_NGI plugin which inserts meta data from our LIMS into reports and stores summary results parsed by MultiQC in our database. This functionality is enormously powerful, facilitating large scale internal data collection that would otherwise require numerous custom scripts. Templates allow report branding and reports are self-contained, making MultiQC an ideal tool for creating delivery reports.<anchor xml:id="a26"/></p>
        <p>4 Conclusion</p>
        <p><anchor xml:id="a27"/>As the field of next-generation sequencing matures, there are increasing numbers of bioinformatics tools producing ever more verbose descriptions of data. Integrating these statistics across tools with large sample sets is difficult and time-consuming. MultiQC can automate the parsing of this metadata, providing powerful visualizations with a simple interface. Extension and data export allow MultiQC to function as a central collection point at the terminus of analysis pipelines. Routine use can aid quality control steps early on in data processing, reducing risk of batch effects and other downstream analysis problems.<anchor xml:id="a28"/></p>
        <p>Acknowledgements</p>
        <p>The authors would like to thank D. Klevebring, L. Pantano, G. Carrasco and R. Andeer for contributed modules and discussion.</p>
        <p>Funding</p>
        <p>This work was supported by the Science for Life Laboratory and the National Genomics Infrastructure, NGI.</p>
        <p>Conflict of Interest : none declared.</p>
        <p>References<anchor xml:id="a29"/></p>
    </body>
  </text>
</TEI>
