From eb984b62d3d77edaaf43361e121bf794749bb73d Mon Sep 17 00:00:00 2001 From: Andrew D Smith Date: Sun, 1 Mar 2026 17:22:39 -0800 Subject: [PATCH 1/3] src/html_template.hpp: putting the html template in a separate file --- src/html_template.hpp | 517 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 517 insertions(+) create mode 100644 src/html_template.hpp diff --git a/src/html_template.hpp b/src/html_template.hpp new file mode 100644 index 0000000..71308d8 --- /dev/null +++ b/src/html_template.hpp @@ -0,0 +1,517 @@ +/* Copyright (C) 2026 Andrew D. Smith + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef SRC_HTML_TEMPLATE_HPP_ +#define SRC_HTML_TEMPLATE_HPP_ + +#include "FalcoConfig.hpp" +#include + +constexpr auto falco_config_html_template = R"( + + + + + + {{filename}} - report + + + + + + + +
+
Report
+
{{date}}
{{filename}} +
+
+

Summary

+ +
+
+
+

+ {{basicstatisticsname}}: {{passbasicstatistics}} +

+ {{basicstatisticsdata}} +
+ +{{perbasesequencequalitycs}} +
+

+ {{perbasesequencequalityname}}: {{passperbasesequencequality}}

+
+
+{{perbasesequencequalityce}} + + +{{pertilesequencequalitycs}} +
+

+ {{pertilesequencequalityname}} : {{passpertilesequencequality}} +

+
+
+{{pertilesequencequalityce}} + +{{persequencequalityscorescs}} +
+

+ {{persequencequalityscoresname}} : {{passpersequencequalityscores}} +

+
+
+{{persequencequalityscoresce}} + +{{perbasesequencecontentcs}} +
+

+ {{perbasesequencecontentname}} : {{passperbasesequencecontent}} +

+
+
+{{perbasesequencecontentce}} + +{{persequencegccontentcs}} +
+

+ {{persequencegccontentname}}: {{passpersequencegccontent}} +

+
+
+{{persequencegccontentce}} + + +{{perbasencontentcs}} +
+

+ {{perbasencontentname}} : {{passperbasencontent}} +

+
+
+{{perbasencontentce}} + +{{sequencelengthdistributioncs}} +
+

+ {{sequencelengthdistributionname}} : {{passsequencelengthdistribution}} +

+
+
+{{sequencelengthdistributionce}} + +{{sequenceduplicationlevelscs}} +
+

+ {{sequenceduplicationlevelsname}} : {{passsequenceduplicationlevels}} +

+
+
+{{sequenceduplicationlevelsce}} + +{{overrepresentedsequencescs}} +
+

+ {{overrepresentedsequencesname}} : {{passoverrepresentedsequences}}

+ {{overrepresentedsequencesdata}} +
+{{overrepresentedsequencesce}} + +{{adaptercontentcs}} +
+

+ {{adaptercontentname}} : {{passadaptercontent}} +

+
+
+{{adaptercontentce}} + +{{kmercontentcs}} +
+

+ {{kmercontentname}} : {{passkmercontent}} +

+
+
+{{kmercontentce}} + + +
+ + + + + + + + + +;)"; + +#endif From 510dda47b3f55a8106b3738ad6683daafcadd8da Mon Sep 17 00:00:00 2001 From: Andrew D Smith Date: Sun, 1 Mar 2026 17:23:44 -0800 Subject: [PATCH 2/3] src/FalcoConfig.cpp: code updates; no code behavior changes expected --- src/FalcoConfig.cpp | 1194 ++++++++++++------------------------------- 1 file changed, 338 insertions(+), 856 deletions(-) diff --git a/src/FalcoConfig.cpp b/src/FalcoConfig.cpp index 5df3556..d4dfbfb 100644 --- a/src/FalcoConfig.cpp +++ b/src/FalcoConfig.cpp @@ -15,13 +15,14 @@ #include "FalcoConfig.hpp" #include "FastqStats.hpp" +#include "html_template.hpp" #include #include -#include -#include #include +#include +#include #include const std::string FalcoConfig::FalcoVersion = "1.2.5"; @@ -31,266 +32,238 @@ const std::string FalcoConfig::FalcoVersion = "1.2.5"; /*********************************************************/ namespace FileConstants { - // These will become const bools in the stream reader - static const std::unordered_map> - limits = { - {"quality_base",{{"ignore",0}}}, - {"duplication",{{"ignore",0}, {"warn",70}, {"error",50}}}, - {"kmer",{{"ignore", 1}, {"warn",2}, {"error",5}}}, - {"n_content",{{"ignore", 0}, {"warn",5}, {"error",20}}}, - {"overrepresented",{{"ignore", 0}, {"warn",0.1}, {"error",1}}}, - {"quality_base_lower",{{"warn",10}, {"error",5}}}, - {"quality_base_median",{{"warn",25}, {"error",20}}}, - {"sequence",{{"ignore", 0}, {"warn",10}, {"error",20}}}, - {"gc_sequence",{{"ignore", 0}, {"warn",15}, {"error",30}}}, - {"quality_sequence",{{"ignore", 0}, {"warn",27}, {"error",20}}}, - {"tile",{{"ignore", 0}, {"warn",5}, {"error",10}}}, - {"sequence_length",{{"ignore", 0}, {"warn",1}, {"error",1}}}, - {"adapter",{{"ignore", 0}, {"warn",5}, {"error",10}}} - }; - - /*************** CONTAMINANTS *****************/ - static const std::vector> - contaminants = { - {"Illumina Single End Adapter 1","GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"}, - {"Illumina Single End Adapter 2","CAAGCAGAAGACGGCATACGAGCTCTTCCGATCT"}, - {"Illumina Single End PCR Primer 1","AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Single End PCR Primer 2","CAAGCAGAAGACGGCATACGAGCTCTTCCGATCT"}, - {"Illumina Single End Sequencing Primer","ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Paired End Adapter 1","ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Paired End Adapter 2","GATCGGAAGAGCGGTTCAGCAGGAATGCCGAG"}, - {"Illumina Paried End PCR Primer 1","AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Paired End PCR Primer 2","CAAGCAGAAGACGGCATACGAGATCGGTCTCGGCATTCCTGCTGAACCGCTCTTCCGATCT"}, - {"Illumina Paried End Sequencing Primer 1","ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Paired End Sequencing Primer 2","CGGTCTCGGCATTCCTGCTGAACCGCTCTTCCGATCT"}, - {"Illumina DpnII expression Adapter 1","ACAGGTTCAGAGTTCTACAGTCCGAC"}, - {"Illumina DpnII expression Adapter 2","CAAGCAGAAGACGGCATACGA"}, - {"Illumina DpnII expression PCR Primer 1","CAAGCAGAAGACGGCATACGA"}, - {"Illumina DpnII expression PCR Primer 2","AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, - {"Illumina DpnII expression Sequencing Primer","CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, - {"Illumina NlaIII expression Adapter 1","ACAGGTTCAGAGTTCTACAGTCCGACATG"}, - {"Illumina NlaIII expression Adapter 2","CAAGCAGAAGACGGCATACGA"}, - {"Illumina NlaIII expression PCR Primer 1","CAAGCAGAAGACGGCATACGA"}, - {"Illumina NlaIII expression PCR Primer 2","AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, - {"Illumina NlaIII expression Sequencing Primer","CCGACAGGTTCAGAGTTCTACAGTCCGACATG"}, - {"Illumina Small RNA Adapter 1","GTTCAGAGTTCTACAGTCCGACGATC"}, - {"Illumina Small RNA Adapter 2","TGGAATTCTCGGGTGCCAAGG"}, - {"Illumina Small RNA RT Primer","CAAGCAGAAGACGGCATACGA"}, - {"Illumina Small RNA PCR Primer 2","AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, - {"Illumina Small RNA Sequencing Primer","CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, - {"Illumina Multiplexing Adapter 1","GATCGGAAGAGCACACGTCT"}, - {"Illumina Multiplexing Adapter 2","ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Multiplexing PCR Primer 1.01","AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Multiplexing PCR Primer 2.01","GTGACTGGAGTTCAGACGTGTGCTCTTCCGATCT"}, - {"Illumina Multiplexing Read1 Sequencing Primer","ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"Illumina Multiplexing Index Sequencing Primer","GATCGGAAGAGCACACGTCTGAACTCCAGTCAC"}, - {"Illumina Multiplexing Read2 Sequencing Primer","GTGACTGGAGTTCAGACGTGTGCTCTTCCGATCT"}, - {"Illumina PCR Primer Index 1","CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 2","CAAGCAGAAGACGGCATACGAGATACATCGGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 3","CAAGCAGAAGACGGCATACGAGATGCCTAAGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 4","CAAGCAGAAGACGGCATACGAGATTGGTCAGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 5","CAAGCAGAAGACGGCATACGAGATCACTGTGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 6","CAAGCAGAAGACGGCATACGAGATATTGGCGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 7","CAAGCAGAAGACGGCATACGAGATGATCTGGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 8","CAAGCAGAAGACGGCATACGAGATTCAAGTGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 9","CAAGCAGAAGACGGCATACGAGATCTGATCGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 10","CAAGCAGAAGACGGCATACGAGATAAGCTAGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 11","CAAGCAGAAGACGGCATACGAGATGTAGCCGTGACTGGAGTTC"}, - {"Illumina PCR Primer Index 12","CAAGCAGAAGACGGCATACGAGATTACAAGGTGACTGGAGTTC"}, - {"Illumina DpnII Gex Adapter 1","GATCGTCGGACTGTAGAACTCTGAAC"}, - {"Illumina DpnII Gex Adapter 1.01","ACAGGTTCAGAGTTCTACAGTCCGAC"}, - {"Illumina DpnII Gex Adapter 2","CAAGCAGAAGACGGCATACGA"}, - {"Illumina DpnII Gex Adapter 2.01","TCGTATGCCGTCTTCTGCTTG"}, - {"Illumina DpnII Gex PCR Primer 1","CAAGCAGAAGACGGCATACGA"}, - {"Illumina DpnII Gex PCR Primer 2","AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, - {"Illumina DpnII Gex Sequencing Primer","CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, - {"Illumina NlaIII Gex Adapter 1.01","TCGGACTGTAGAACTCTGAAC"}, - {"Illumina NlaIII Gex Adapter 1.02","ACAGGTTCAGAGTTCTACAGTCCGACATG"}, - {"Illumina NlaIII Gex Adapter 2.01","CAAGCAGAAGACGGCATACGA"}, - {"Illumina NlaIII Gex Adapter 2.02","TCGTATGCCGTCTTCTGCTTG"}, - {"Illumina NlaIII Gex PCR Primer 1","CAAGCAGAAGACGGCATACGA"}, - {"Illumina NlaIII Gex PCR Primer 2","AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, - {"Illumina NlaIII Gex Sequencing Primer","CCGACAGGTTCAGAGTTCTACAGTCCGACATG"}, - {"Illumina 5p RNA Adapter","GTTCAGAGTTCTACAGTCCGACGATC"}, - {"Illumina RNA Adapter1","TGGAATTCTCGGGTGCCAAGG"}, - {"Illumina Small RNA 3p Adapter 1","ATCTCGTATGCCGTCTTCTGCTTG"}, - {"Illumina Small RNA PCR Primer 1","CAAGCAGAAGACGGCATACGA"}, - {"TruSeq Universal Adapter","AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, - {"TruSeq Adapter, Index 1","GATCGGAAGAGCACACGTCTGAACTCCAGTCACATCACGATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 2","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 3","GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 4","GATCGGAAGAGCACACGTCTGAACTCCAGTCACTGACCAATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 5","GATCGGAAGAGCACACGTCTGAACTCCAGTCACACAGTGATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 6","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGCCAATATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 7","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCAGATCATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 8","GATCGGAAGAGCACACGTCTGAACTCCAGTCACACTTGAATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 9","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGATCAGATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 10","GATCGGAAGAGCACACGTCTGAACTCCAGTCACTAGCTTATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 11","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGGCTACATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 12","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCTTGTAATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 13","GATCGGAAGAGCACACGTCTGAACTCCAGTCACAGTCAACTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 14","GATCGGAAGAGCACACGTCTGAACTCCAGTCACAGTTCCGTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 15","GATCGGAAGAGCACACGTCTGAACTCCAGTCACATGTCAGTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 16","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCGTCCCTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 18","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTCCGCATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 19","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTGAAACTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 20","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTGGCCTTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 21","GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTTTCGGTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 22","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGTACGTTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 23","GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCACTCTTCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 25","GATCGGAAGAGCACACGTCTGAACTCCAGTCACACTGATATCTCGTATGCCGTCTTCTGCTTG"}, - {"TruSeq Adapter, Index 27","GATCGGAAGAGCACACGTCTGAACTCCAGTCACATTCCTTTCTCGTATGCCGTCTTCTGCTTG"}, - {"Illumina RNA RT Primer","GCCTTGGCACCCGAGAATTCCA"}, - {"Illumina RNA PCR Primer","AATGATACGGCGACCACCGAGATCTACACGTTCAGAGTTCTACAGTCCGA"}, - {"RNA PCR Primer, Index 1","CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 2","CAAGCAGAAGACGGCATACGAGATACATCGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 3","CAAGCAGAAGACGGCATACGAGATGCCTAAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 4","CAAGCAGAAGACGGCATACGAGATTGGTCAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 5","CAAGCAGAAGACGGCATACGAGATCACTGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 6","CAAGCAGAAGACGGCATACGAGATATTGGCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 7","CAAGCAGAAGACGGCATACGAGATGATCTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 8","CAAGCAGAAGACGGCATACGAGATTCAAGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 9","CAAGCAGAAGACGGCATACGAGATCTGATCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 10","CAAGCAGAAGACGGCATACGAGATAAGCTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 11","CAAGCAGAAGACGGCATACGAGATGTAGCCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 12","CAAGCAGAAGACGGCATACGAGATTACAAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 13","CAAGCAGAAGACGGCATACGAGATTTGACTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 14","CAAGCAGAAGACGGCATACGAGATGGAACTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 15","CAAGCAGAAGACGGCATACGAGATTGACATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 16","CAAGCAGAAGACGGCATACGAGATGGACGGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 17","CAAGCAGAAGACGGCATACGAGATCTCTACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 18","CAAGCAGAAGACGGCATACGAGATGCGGACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 19","CAAGCAGAAGACGGCATACGAGATTTTCACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 20","CAAGCAGAAGACGGCATACGAGATGGCCACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 21","CAAGCAGAAGACGGCATACGAGATCGAAACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 22","CAAGCAGAAGACGGCATACGAGATCGTACGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 23","CAAGCAGAAGACGGCATACGAGATCCACTCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 24","CAAGCAGAAGACGGCATACGAGATGCTACCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 25","CAAGCAGAAGACGGCATACGAGATATCAGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 26","CAAGCAGAAGACGGCATACGAGATGCTCATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 27","CAAGCAGAAGACGGCATACGAGATAGGAATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 28","CAAGCAGAAGACGGCATACGAGATCTTTTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 29","CAAGCAGAAGACGGCATACGAGATTAGTTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 30","CAAGCAGAAGACGGCATACGAGATCCGGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 31","CAAGCAGAAGACGGCATACGAGATATCGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 32","CAAGCAGAAGACGGCATACGAGATTGAGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 33","CAAGCAGAAGACGGCATACGAGATCGCCTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 34","CAAGCAGAAGACGGCATACGAGATGCCATGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 35","CAAGCAGAAGACGGCATACGAGATAAAATGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 36","CAAGCAGAAGACGGCATACGAGATTGTTGGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 37","CAAGCAGAAGACGGCATACGAGATATTCCGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 38","CAAGCAGAAGACGGCATACGAGATAGCTAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 39","CAAGCAGAAGACGGCATACGAGATGTATAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 40","CAAGCAGAAGACGGCATACGAGATTCTGAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 41","CAAGCAGAAGACGGCATACGAGATGTCGTCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 42","CAAGCAGAAGACGGCATACGAGATCGATTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 43","CAAGCAGAAGACGGCATACGAGATGCTGTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 44","CAAGCAGAAGACGGCATACGAGATATTATAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 45","CAAGCAGAAGACGGCATACGAGATGAATGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 46","CAAGCAGAAGACGGCATACGAGATTCGGGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 47","CAAGCAGAAGACGGCATACGAGATCTTCGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"RNA PCR Primer, Index 48","CAAGCAGAAGACGGCATACGAGATTGCCGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, - {"ABI Dynabead EcoP Oligo","CTGATCTAGAGGTACCGGATCCCAGCAGT"}, - {"ABI Solid3 Adapter A","CTGCCCCGGGTTCCTCATTCTCTCAGCAGCATG"}, - {"ABI Solid3 Adapter B","CCACTACGCCTCCGCTTTCCTCTCTATGGGCAGTCGGTGAT"}, - {"ABI Solid3 5' AMP Primer","CCACTACGCCTCCGCTTTCCTCTCTATG"}, - {"ABI Solid3 3' AMP Primer","CTGCCCCGGGTTCCTCATTCT"}, - {"ABI Solid3 EF1 alpha Sense Primer","CATGTGTGTTGAGAGCTTC"}, - {"ABI Solid3 EF1 alpha Antisense Primer","GAAAACCAAAGTGGTCCAC"}, - {"ABI Solid3 GAPDH Forward Primer","TTAGCACCCCTGGCCAAGG"}, - {"ABI Solid3 GAPDH Reverse Primer","CTTACTCCTTGGAGGCCATG"}, - {"Clontech Universal Primer Mix Short","CTAATACGACTCACTATAGGGC"}, - {"Clontech Universal Primer Mix Long","CTAATACGACTCACTATAGGGCAAGCAGTGGTATCAACGCAGAGT"}, - {"Clontech SMARTer II A Oligonucleotide","AAGCAGTGGTATCAACGCAGAGTAC"}, - {"Clontech SMART CDS Primer II A","AAGCAGTGGTATCAACGCAGAGTACT"}, - {"Clontech_Universal_Primer_Mix_Short","CTAATACGACTCACTATAGGGC"}, - {"Clontech_Universal_Primer_Mix_Long","CTAATACGACTCACTATAGGGCAAGCAGTGGTATCAACGCAGAGT"}, - {"Clontech_SMARTer_II_A_Oligonucleotide","AAGCAGTGGTATCAACGCAGAGTAC"}, - {"Clontech_SMART_CDS_Primer_II_A","AAGCAGTGGTATCAACGCAGAGTACT"}, - {"Clontech_SMART_CDS_Primer_II_A","ACGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGATCTCGGTGGTCGC"}, - {"Clontech_SMART_CDS_Primer_II_A","GAGTACGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGATCTCGGTGGT"} - }; - - /*************** ADAPTERS *********************/ - // Name (eg: Illumina Small RNA adapter) - static const std::vector - adapter_names = { - "Illumina Universal Adapter", - "Illumina Small RNA 3 prime Adapter", - "Illumina Small RNA 5 prime Adapter", - "Nextera Transposase Sequence", - "SOLID Small RNA Adapter", - }; - - // Actual string sequence (eg: ATTGCCACA) - static const std::vector - adapter_seqs = { - "AGATCGGAAGAG", - "TGGAATTCTCGG", - "GATCGTCGGACT", - "CTGTCTCTTATA", - "CGCCTTGGCCGT", - }; +// These will become const bools in the stream reader +static const std::unordered_map> + limits = {{"quality_base", {{"ignore", 0}}}, + {"duplication", {{"ignore", 0}, {"warn", 70}, {"error", 50}}}, + {"kmer", {{"ignore", 1}, {"warn", 2}, {"error", 5}}}, + {"n_content", {{"ignore", 0}, {"warn", 5}, {"error", 20}}}, + {"overrepresented", {{"ignore", 0}, {"warn", 0.1}, {"error", 1}}}, + {"quality_base_lower", {{"warn", 10}, {"error", 5}}}, + {"quality_base_median", {{"warn", 25}, {"error", 20}}}, + {"sequence", {{"ignore", 0}, {"warn", 10}, {"error", 20}}}, + {"gc_sequence", {{"ignore", 0}, {"warn", 15}, {"error", 30}}}, + {"quality_sequence", {{"ignore", 0}, {"warn", 27}, {"error", 20}}}, + {"tile", {{"ignore", 0}, {"warn", 5}, {"error", 10}}}, + {"sequence_length", {{"ignore", 0}, {"warn", 1}, {"error", 1}}}, + {"adapter", {{"ignore", 0}, {"warn", 5}, {"error", 10}}}}; + +/*************** CONTAMINANTS *****************/ +// clang-format off +static const auto contaminants = std::vector>{ + {"Illumina Single End Adapter 1", "GATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG"}, + {"Illumina Single End Adapter 2", "CAAGCAGAAGACGGCATACGAGCTCTTCCGATCT"}, + {"Illumina Single End PCR Primer 1", "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Single End PCR Primer 2", "CAAGCAGAAGACGGCATACGAGCTCTTCCGATCT"}, + {"Illumina Single End Sequencing Primer", "ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Paired End Adapter 1", "ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Paired End Adapter 2", "GATCGGAAGAGCGGTTCAGCAGGAATGCCGAG"}, + {"Illumina Paried End PCR Primer 1", "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Paired End PCR Primer 2", "CAAGCAGAAGACGGCATACGAGATCGGTCTCGGCATTCCTGCTGAACCGCTCTTCCGATCT"}, + {"Illumina Paried End Sequencing Primer 1", "ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Paired End Sequencing Primer 2", "CGGTCTCGGCATTCCTGCTGAACCGCTCTTCCGATCT"}, + {"Illumina DpnII expression Adapter 1", "ACAGGTTCAGAGTTCTACAGTCCGAC"}, + {"Illumina DpnII expression Adapter 2", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina DpnII expression PCR Primer 1", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina DpnII expression PCR Primer 2", "AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, + {"Illumina DpnII expression Sequencing Primer", "CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, + {"Illumina NlaIII expression Adapter 1", "ACAGGTTCAGAGTTCTACAGTCCGACATG"}, + {"Illumina NlaIII expression Adapter 2", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina NlaIII expression PCR Primer 1", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina NlaIII expression PCR Primer 2", "AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, + {"Illumina NlaIII expression Sequencing Primer", "CCGACAGGTTCAGAGTTCTACAGTCCGACATG"}, + {"Illumina Small RNA Adapter 1", "GTTCAGAGTTCTACAGTCCGACGATC"}, + {"Illumina Small RNA Adapter 2", "TGGAATTCTCGGGTGCCAAGG"}, + {"Illumina Small RNA RT Primer", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina Small RNA PCR Primer 2", "AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, + {"Illumina Small RNA Sequencing Primer", "CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, + {"Illumina Multiplexing Adapter 1", "GATCGGAAGAGCACACGTCT"}, + {"Illumina Multiplexing Adapter 2", "ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Multiplexing PCR Primer 1.01", "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Multiplexing PCR Primer 2.01", "GTGACTGGAGTTCAGACGTGTGCTCTTCCGATCT"}, + {"Illumina Multiplexing Read1 Sequencing Primer", "ACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"Illumina Multiplexing Index Sequencing Primer", "GATCGGAAGAGCACACGTCTGAACTCCAGTCAC"}, + {"Illumina Multiplexing Read2 Sequencing Primer", "GTGACTGGAGTTCAGACGTGTGCTCTTCCGATCT"}, + {"Illumina PCR Primer Index 1", "CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 2", "CAAGCAGAAGACGGCATACGAGATACATCGGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 3", "CAAGCAGAAGACGGCATACGAGATGCCTAAGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 4", "CAAGCAGAAGACGGCATACGAGATTGGTCAGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 5", "CAAGCAGAAGACGGCATACGAGATCACTGTGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 6", "CAAGCAGAAGACGGCATACGAGATATTGGCGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 7", "CAAGCAGAAGACGGCATACGAGATGATCTGGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 8", "CAAGCAGAAGACGGCATACGAGATTCAAGTGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 9", "CAAGCAGAAGACGGCATACGAGATCTGATCGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 10", "CAAGCAGAAGACGGCATACGAGATAAGCTAGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 11", "CAAGCAGAAGACGGCATACGAGATGTAGCCGTGACTGGAGTTC"}, + {"Illumina PCR Primer Index 12", "CAAGCAGAAGACGGCATACGAGATTACAAGGTGACTGGAGTTC"}, + {"Illumina DpnII Gex Adapter 1", "GATCGTCGGACTGTAGAACTCTGAAC"}, + {"Illumina DpnII Gex Adapter 1.01", "ACAGGTTCAGAGTTCTACAGTCCGAC"}, + {"Illumina DpnII Gex Adapter 2", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina DpnII Gex Adapter 2.01", "TCGTATGCCGTCTTCTGCTTG"}, + {"Illumina DpnII Gex PCR Primer 1", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina DpnII Gex PCR Primer 2", "AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, + {"Illumina DpnII Gex Sequencing Primer", "CGACAGGTTCAGAGTTCTACAGTCCGACGATC"}, + {"Illumina NlaIII Gex Adapter 1.01", "TCGGACTGTAGAACTCTGAAC"}, + {"Illumina NlaIII Gex Adapter 1.02", "ACAGGTTCAGAGTTCTACAGTCCGACATG"}, + {"Illumina NlaIII Gex Adapter 2.01", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina NlaIII Gex Adapter 2.02", "TCGTATGCCGTCTTCTGCTTG"}, + {"Illumina NlaIII Gex PCR Primer 1", "CAAGCAGAAGACGGCATACGA"}, + {"Illumina NlaIII Gex PCR Primer 2", "AATGATACGGCGACCACCGACAGGTTCAGAGTTCTACAGTCCGA"}, + {"Illumina NlaIII Gex Sequencing Primer", "CCGACAGGTTCAGAGTTCTACAGTCCGACATG"}, + {"Illumina 5p RNA Adapter", "GTTCAGAGTTCTACAGTCCGACGATC"}, + {"Illumina RNA Adapter1", "TGGAATTCTCGGGTGCCAAGG"}, + {"Illumina Small RNA 3p Adapter 1", "ATCTCGTATGCCGTCTTCTGCTTG"}, + {"Illumina Small RNA PCR Primer 1", "CAAGCAGAAGACGGCATACGA"}, + {"TruSeq Universal Adapter", "AATGATACGGCGACCACCGAGATCTACACTCTTTCCCTACACGACGCTCTTCCGATCT"}, + {"TruSeq Adapter, Index 1", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACATCACGATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 2", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 3", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 4", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTGACCAATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 5", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACACAGTGATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 6", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGCCAATATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 7", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCAGATCATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 8", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACACTTGAATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 9", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGATCAGATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 10", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACTAGCTTATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 11", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGGCTACATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 12", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCTTGTAATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 13", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACAGTCAACTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 14", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACAGTTCCGTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 15", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACATGTCAGTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 16", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCGTCCCTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 18", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTCCGCATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 19", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTGAAACTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 20", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTGGCCTTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 21", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACGTTTCGGTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 22", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGTACGTTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 23", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACCCACTCTTCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 25", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACACTGATATCTCGTATGCCGTCTTCTGCTTG"}, + {"TruSeq Adapter, Index 27", "GATCGGAAGAGCACACGTCTGAACTCCAGTCACATTCCTTTCTCGTATGCCGTCTTCTGCTTG"}, + {"Illumina RNA RT Primer", "GCCTTGGCACCCGAGAATTCCA"}, + {"Illumina RNA PCR Primer", "AATGATACGGCGACCACCGAGATCTACACGTTCAGAGTTCTACAGTCCGA"}, + {"RNA PCR Primer, Index 1", "CAAGCAGAAGACGGCATACGAGATCGTGATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 2", "CAAGCAGAAGACGGCATACGAGATACATCGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 3", "CAAGCAGAAGACGGCATACGAGATGCCTAAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 4", "CAAGCAGAAGACGGCATACGAGATTGGTCAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 5", "CAAGCAGAAGACGGCATACGAGATCACTGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 6", "CAAGCAGAAGACGGCATACGAGATATTGGCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 7", "CAAGCAGAAGACGGCATACGAGATGATCTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 8", "CAAGCAGAAGACGGCATACGAGATTCAAGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 9", "CAAGCAGAAGACGGCATACGAGATCTGATCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 10", "CAAGCAGAAGACGGCATACGAGATAAGCTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 11", "CAAGCAGAAGACGGCATACGAGATGTAGCCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 12", "CAAGCAGAAGACGGCATACGAGATTACAAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 13", "CAAGCAGAAGACGGCATACGAGATTTGACTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 14", "CAAGCAGAAGACGGCATACGAGATGGAACTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 15", "CAAGCAGAAGACGGCATACGAGATTGACATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 16", "CAAGCAGAAGACGGCATACGAGATGGACGGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 17", "CAAGCAGAAGACGGCATACGAGATCTCTACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 18", "CAAGCAGAAGACGGCATACGAGATGCGGACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 19", "CAAGCAGAAGACGGCATACGAGATTTTCACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 20", "CAAGCAGAAGACGGCATACGAGATGGCCACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 21", "CAAGCAGAAGACGGCATACGAGATCGAAACGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 22", "CAAGCAGAAGACGGCATACGAGATCGTACGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 23", "CAAGCAGAAGACGGCATACGAGATCCACTCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 24", "CAAGCAGAAGACGGCATACGAGATGCTACCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 25", "CAAGCAGAAGACGGCATACGAGATATCAGTGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 26", "CAAGCAGAAGACGGCATACGAGATGCTCATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 27", "CAAGCAGAAGACGGCATACGAGATAGGAATGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 28", "CAAGCAGAAGACGGCATACGAGATCTTTTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 29", "CAAGCAGAAGACGGCATACGAGATTAGTTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 30", "CAAGCAGAAGACGGCATACGAGATCCGGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 31", "CAAGCAGAAGACGGCATACGAGATATCGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 32", "CAAGCAGAAGACGGCATACGAGATTGAGTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 33", "CAAGCAGAAGACGGCATACGAGATCGCCTGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 34", "CAAGCAGAAGACGGCATACGAGATGCCATGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 35", "CAAGCAGAAGACGGCATACGAGATAAAATGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 36", "CAAGCAGAAGACGGCATACGAGATTGTTGGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 37", "CAAGCAGAAGACGGCATACGAGATATTCCGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 38", "CAAGCAGAAGACGGCATACGAGATAGCTAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 39", "CAAGCAGAAGACGGCATACGAGATGTATAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 40", "CAAGCAGAAGACGGCATACGAGATTCTGAGGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 41", "CAAGCAGAAGACGGCATACGAGATGTCGTCGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 42", "CAAGCAGAAGACGGCATACGAGATCGATTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 43", "CAAGCAGAAGACGGCATACGAGATGCTGTAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 44", "CAAGCAGAAGACGGCATACGAGATATTATAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 45", "CAAGCAGAAGACGGCATACGAGATGAATGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 46", "CAAGCAGAAGACGGCATACGAGATTCGGGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 47", "CAAGCAGAAGACGGCATACGAGATCTTCGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"RNA PCR Primer, Index 48", "CAAGCAGAAGACGGCATACGAGATTGCCGAGTGACTGGAGTTCCTTGGCACCCGAGAATTCCA"}, + {"ABI Dynabead EcoP Oligo", "CTGATCTAGAGGTACCGGATCCCAGCAGT"}, + {"ABI Solid3 Adapter A", "CTGCCCCGGGTTCCTCATTCTCTCAGCAGCATG"}, + {"ABI Solid3 Adapter B", "CCACTACGCCTCCGCTTTCCTCTCTATGGGCAGTCGGTGAT"}, + {"ABI Solid3 5' AMP Primer", "CCACTACGCCTCCGCTTTCCTCTCTATG"}, + {"ABI Solid3 3' AMP Primer", "CTGCCCCGGGTTCCTCATTCT"}, + {"ABI Solid3 EF1 alpha Sense Primer", "CATGTGTGTTGAGAGCTTC"}, + {"ABI Solid3 EF1 alpha Antisense Primer", "GAAAACCAAAGTGGTCCAC"}, + {"ABI Solid3 GAPDH Forward Primer", "TTAGCACCCCTGGCCAAGG"}, + {"ABI Solid3 GAPDH Reverse Primer", "CTTACTCCTTGGAGGCCATG"}, + {"Clontech Universal Primer Mix Short", "CTAATACGACTCACTATAGGGC"}, + {"Clontech Universal Primer Mix Long", "CTAATACGACTCACTATAGGGCAAGCAGTGGTATCAACGCAGAGT"}, + {"Clontech SMARTer II A Oligonucleotide", "AAGCAGTGGTATCAACGCAGAGTAC"}, + {"Clontech SMART CDS Primer II A", "AAGCAGTGGTATCAACGCAGAGTACT"}, + {"Clontech_Universal_Primer_Mix_Short", "CTAATACGACTCACTATAGGGC"}, + {"Clontech_Universal_Primer_Mix_Long", "CTAATACGACTCACTATAGGGCAAGCAGTGGTATCAACGCAGAGT"}, + {"Clontech_SMARTer_II_A_Oligonucleotide", "AAGCAGTGGTATCAACGCAGAGTAC"}, + {"Clontech_SMART_CDS_Primer_II_A", "AAGCAGTGGTATCAACGCAGAGTACT"}, + {"Clontech_SMART_CDS_Primer_II_A", "ACGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGATCTCGGTGGTCGC"}, + {"Clontech_SMART_CDS_Primer_II_A", "GAGTACGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGATCTCGGTGGT"}, +}; +// clang-format on + +/*************** ADAPTERS *********************/ +// Name (eg: Illumina Small RNA adapter) +static const auto adapter_names = std::vector{ + "Illumina Universal Adapter", + "Illumina Small RNA 3 prime Adapter", + "Illumina Small RNA 5 prime Adapter", + "Nextera Transposase Sequence", + "SOLID Small RNA Adapter", +}; - static const size_t adapter_size = 12; +// Actual string sequence (eg: ATTGCCACA) +// clang-format off +static const auto adapter_seqs = std::vector{ + "AGATCGGAAGAG", + "TGGAATTCTCGG", + "GATCGTCGGACT", + "CTGTCTCTTATA", + "CGCCTTGGCCGT", }; +// clang-format on +static const std::size_t adapter_size = 12; +}; // namespace FileConstants /********************************************************************/ /**************************** AUX FUNCTIONS *************************/ /********************************************************************/ // Check if line is not a comment or newline -inline bool -is_content_line (const std::string &line) { - // comment - if (line[0] == '#') - return false; - - // newline - if (line.size() <= 1) - return false; - - return true; -} - -// Check existance of config files -inline bool -file_exists(const std::string& name) { - return access(std::data(name), F_OK) == 0; +static inline bool +is_content_line(const std::string &line) { + // ADS: not sure why this needs to require the line to have a length greater + // than 1 instead of 0. + return line.front() != '#' && std::size(line) > 1; } - -// This function is necessary for conda: -// zero bytes appear for whatever reason -// in the compile-time-resolved PROGRAM_PATH -// variable, and files are not read properly -// if these bytes are not removed +// This function is necessary for conda: zero bytes appear for whatever reason +// in the compile-time-resolved PROGRAM_PATH variable, and files are not read +// properly if these bytes are not removed void clean_zero_bytes(std::string &filename) { - filename.erase(std::remove(begin(filename), end(filename), '\0'), end(filename)); + filename.erase(std::remove(std::begin(filename), std::end(filename), '\0'), + std::end(filename)); } // Check if a std::string ends with another, // to be use to figure out the file format inline bool -endswith(std::string const &value, std::string const &ending) { - if (ending.size() > value.size()) { +endswith(const std::string &fn, const std::string &extn) { + if (std::size(extn) > std::size(fn)) return false; - } - return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); -} - -// Removes absolute path from a file -static std::string -strip_path(std::string full_path) { - size_t start = full_path.find_last_of('/'); - if (start == std::string::npos) - start = 0; - else - ++start; - return full_path.substr(start); + return std::equal(std::crbegin(extn), std::crend(extn), std::rbegin(fn)); } /********************************************************************/ @@ -308,7 +281,8 @@ FalcoConfig::FalcoConfig(const int argc, char *argv[]) { read_step = 1; format = ""; threads = 1; - contaminants_file = std::string(PROGRAM_PATH) + "/Configuration/contaminant_list.txt"; + contaminants_file = + std::string(PROGRAM_PATH) + "/Configuration/contaminant_list.txt"; adapters_file = std::string(PROGRAM_PATH) + "/Configuration/adapter_list.txt"; limits_file = std::string(PROGRAM_PATH) + "/Configuration/limits.txt"; @@ -316,7 +290,6 @@ FalcoConfig::FalcoConfig(const int argc, char *argv[]) { clean_zero_bytes(adapters_file); clean_zero_bytes(limits_file); - quiet = false; progress = false; tmpdir = "."; @@ -329,49 +302,48 @@ FalcoConfig::FalcoConfig(const int argc, char *argv[]) { std::ostringstream ost; for (int i = 0; i < argc; ++i) { if (i != 0) - ost << " " ; + ost << " "; ost << std::string(argv[i]); } call = ost.str(); } -const std::vector FalcoConfig::values_to_check({ - "duplication", - "kmer", - "n_content", - "overrepresented", - "quality_base", - "sequence", - "gc_sequence", - "quality_sequence", - "tile", - "sequence_length", - "adapter", - "duplication", - "kmer", - "n_content", - "overrepresented", - "quality_base_lower", - "quality_base_median", - "sequence", - "gc_sequence", - "quality_sequence", - "tile", - "sequence_length", - "adapter" - }); +const std::vector FalcoConfig::values_to_check = { + "duplication", + "kmer", + "n_content", + "overrepresented", + "quality_base", + "sequence", + "gc_sequence", + "quality_sequence", + "tile", + "sequence_length", + "adapter", + "duplication", + "kmer", + "n_content", + "overrepresented", + "quality_base_lower", + "quality_base_median", + "sequence", + "gc_sequence", + "quality_sequence", + "tile", + "sequence_length", + "adapter", +}; template bool -check_if_not_ignored(const T& limits_map, - const std::string &limit) { +check_if_not_ignored(const T &limits_map, const std::string &limit) { if (limits_map.find(limit) == end(limits_map)) throw std::runtime_error("no instructions for limit " + limit); const auto the_limit = limits_map.find(limit)->second; if (the_limit.find("ignore") == end(the_limit)) throw std::runtime_error("'ignore' option not set for limit " + limit); - + const bool ret = (the_limit.find("ignore")->second == 0.0); return ret; @@ -383,68 +355,74 @@ FalcoConfig::setup() { define_file_format(); // Get filename without absolute path - filename_stripped = strip_path(filename); + filename_stripped = std::filesystem::path(filename).filename().string(); // read which modules to run and the cutoffs for pass/warn/fail read_limits(); // Read files for appropriate modules - if (do_adapter) read_adapters(); - if (do_overrepresented) read_contaminants_file(); + if (do_adapter) + read_adapters(); + if (do_overrepresented) + read_contaminants_file(); } void FalcoConfig::define_file_format() { - std::transform(begin(format), end(format), begin(format), tolower); - std::string tmp_filename = filename; - std::transform(begin(tmp_filename), end(tmp_filename), begin(tmp_filename), tolower); + const auto to_lower = [](auto &s) { + std::transform(std::cbegin(s), std::cend(s), std::begin(s), + [](const auto c) { return std::tolower(c); }); + }; + to_lower(format); - // reset, important bececause the same FalcoConfig object is used - // across possibly multiple input files - is_sam = is_bam = is_fastq_gz = is_fastq = false; - if (format == "") { - if (endswith(tmp_filename, "sam") || - endswith(tmp_filename, "sam_mapped")) { + // reset, important bececause the same FalcoConfig object is used across + // possibly multiple input files + is_sam = false; + is_bam = false; + is_fastq_gz = false; + is_fastq = false; + + if (format.empty()) { + auto filename_lower(filename); + to_lower(filename_lower); + if (endswith(filename, ".sam") || endswith(filename, ".sam_mapped")) { is_sam = true; } #ifdef USE_HTS - else if (endswith(tmp_filename, "bam") || - endswith(tmp_filename, "bam_mapped")) { + else if (endswith(filename, ".bam") || endswith(filename, ".bam_mapped")) { is_bam = true; } #endif - else if (endswith(tmp_filename, "fastq.gz")) { - is_fastq_gz = true; - } - else if (endswith(tmp_filename, "fq.gz")) { + else if (endswith(filename, ".fastq.gz") || endswith(filename, ".fq.gz")) { is_fastq_gz = true; } - else if (endswith(tmp_filename, "fastq")) { - is_fastq = true; - } - else if (endswith(tmp_filename, "fq")) { + else if (endswith(filename, ".fastq") || endswith(filename, ".fq")) { is_fastq = true; } } else { - if (format == "sam") is_sam = true; + if (format == "sam") + is_sam = true; #ifdef USE_HTS - else if (format == "bam") is_bam = true; + else if (format == "bam") + is_bam = true; #endif - else if (format == "fq.gz" || format == "fastq.gz") is_fastq_gz = true; - else if (format == "fq" || format == "fastq") is_fastq = true; - else throw std::runtime_error("unrecognized file format: " + format); + else if (format == "fq.gz" || format == "fastq.gz") + is_fastq_gz = true; + else if (format == "fq" || format == "fastq") + is_fastq = true; + else + throw std::runtime_error("unrecognized file format: " + format); } } - void FalcoConfig::read_limits() { limits = FileConstants::limits; - if (!file_exists(limits_file)) { + if (!std::filesystem::exists(limits_file)) { if (!quiet) std::cerr << "[limits]\tWARNING: using default limits because " - << "limits file does not exist: " << limits_file << "\n"; + << "limits file does not exist: " << limits_file << "\n"; } else { std::ifstream in(limits_file); @@ -452,39 +430,36 @@ FalcoConfig::read_limits() { throw std::runtime_error("problem opening limits file: " + limits_file); if (!quiet) - std::cerr << "[limits]\tusing file " << limits_file << "\n"; + std::cerr << "[limits]\tusing file " << limits_file << "\n"; // Variables to parse lines std::string line, instruction; - double value; - while (getline(in, line)) { + double value{}; + while (std::getline(in, line)) { // Checks if the line has something to be parsed - if (is_content_line(line)) { - std::istringstream iss(line); + if (!is_content_line(line)) + continue; - // Every line is a limit, warn/error/ignore and the value - std::string limit; - if (!(iss >> limit >> instruction >> value)) - throw std::runtime_error("malformed limits line: \"" + line + "\""); + // Every line is a limit, warn/error/ignore and the value + std::istringstream iss(line); + std::string limit; + if (!(iss >> limit >> instruction >> value)) + throw std::runtime_error("malformed limits line: \"" + line + "\""); - if (find(begin(values_to_check), end(values_to_check), limit) - == end(values_to_check)) - throw std::runtime_error("unknown limit option: " + limit); + if (std::find(std::cbegin(values_to_check), std::cend(values_to_check), + limit) == std::cend(values_to_check)) + throw std::runtime_error("unknown limit option: " + limit); - if (instruction != "warn" && - instruction != "error" && - instruction != "ignore") - throw std::runtime_error("unknown instruction for limit " + - limit + ": " + instruction); + if (instruction != "warn" && instruction != "error" && + instruction != "ignore") + throw std::runtime_error("unknown instruction for limit " + limit + + ": " + instruction); - limits[limit][instruction] = value; - } + limits[limit][instruction] = value; } - in.close(); } // Get data from config that tells us which analyses to skip - do_duplication = check_if_not_ignored(limits, "duplication"); do_kmer = check_if_not_ignored(limits, "kmer"); do_n_content = check_if_not_ignored(limits, "n_content"); @@ -499,34 +474,32 @@ FalcoConfig::read_limits() { do_adapter_optimized = false; } -size_t +std::size_t hash_adapter(const std::string &s) { - size_t ans = 0; - for (size_t i = 0; i < s.size(); ++i) { + std::size_t ans = 0; + for (std::size_t i = 0; i < std::size(s); ++i) { if (s[i] != 'A' && s[i] != 'C' && s[i] != 'T' && s[i] != 'G') throw std::runtime_error("Bad adapter (non-ATGC characters): " + s); - ans = (ans << 2) | actg_to_2bit(s[i]); } - return ans; } void FalcoConfig::read_adapters() { - if (!file_exists(adapters_file)) { + if (!std::filesystem::exists(adapters_file)) { if (!quiet) std::cerr << "[adapters]\tWARNING: using default adapters because " - << "adapters file does not exist: " << adapters_file << "\n"; + << "adapters file does not exist: " << adapters_file << "\n"; adapter_names = FileConstants::adapter_names; adapter_seqs = FileConstants::adapter_seqs; adapter_hashes.clear(); - for (size_t i = 0; i < adapter_seqs.size(); ++i) + for (size_t i = 0; i < std::size(adapter_seqs); ++i) adapter_hashes.push_back(hash_adapter(adapter_seqs[i])); - shortest_adapter_size = adapter_size = adapter_seqs[0].size(); + shortest_adapter_size = adapter_size = std::size(adapter_seqs[0]); return; } @@ -537,7 +510,7 @@ FalcoConfig::read_adapters() { if (!quiet) std::cerr << "[adapters]\tusing file " << adapters_file << "\n"; - std::string line, _tmp; + std::string line, token; std::vector line_by_space; std::string adapter_name, adapter_seq; @@ -550,31 +523,31 @@ FalcoConfig::read_adapters() { adapter_hashes.clear(); do_adapter_optimized = true; - while (getline(in, line)) { + while (std::getline(in, line)) { if (is_content_line(line)) { - if (adapter_names.size() > Constants::max_adapters) { - in.close(); - throw std::runtime_error("You are testing too many adapters. The maximum " - "number is 128!"); + if (std::size(adapter_names) > Constants::max_adapters) { + throw std::runtime_error( + "You are testing too many adapters. The maximum " + "number is 128!"); } adapter_name = ""; adapter_seq = ""; line_by_space.clear(); std::istringstream iss(line); - while (iss >> _tmp) { - line_by_space.push_back(_tmp); - } + while (iss >> token) + line_by_space.push_back(token); - if (line_by_space.size() > 1) { + if (std::size(line_by_space) > 1) { adapter_name = line_by_space[0]; - for (size_t i = 1; i < line_by_space.size() - 1; ++i) + for (size_t i = 1; i < std::size(line_by_space) - 1; ++i) adapter_name += " " + line_by_space[i]; adapter_seq = line_by_space.back(); - if (adapter_seq.size() > 32) { - std::cerr << "[adapters]\tadapter size is more then 32. Use slow adapters search\n"; + if (std::size(adapter_seq) > 32) { + std::cerr << "[adapters]\tadapter size is more then 32. Use slow " + "adapters search\n"; do_adapter_optimized = false; } } @@ -585,33 +558,35 @@ FalcoConfig::read_adapters() { adapter_hashes.push_back(hash_adapter(adapter_seq)); if (adapter_size == 0) { - adapter_size = adapter_seq.size(); + adapter_size = std::size(adapter_seq); shortest_adapter_size = adapter_size; } - else if (adapter_seq.size() != adapter_size) { - std::cerr << "[adapters]\tadapters have different size. Use slow adapters search\n"; + else if (std::size(adapter_seq) != adapter_size) { + std::cerr << "[adapters]\tadapters have different size. Use slow " + "adapters search\n"; do_adapter_optimized = false; - if(adapter_seq.size() < shortest_adapter_size){ - shortest_adapter_size = adapter_seq.size(); + if (std::size(adapter_seq) < shortest_adapter_size) { + shortest_adapter_size = std::size(adapter_seq); } } } } - in.close(); } void FalcoConfig::read_contaminants_file() { - if (!file_exists(contaminants_file)) { + if (!std::filesystem::exists(contaminants_file)) { if (!quiet) - std::cerr << "[contaminants]\tWARNING: using default contaminants because " - << "contaminants file does not exist: " << contaminants_file << "\n"; + std::cerr + << "[contaminants]\tWARNING: using default contaminants because " + << "contaminants file does not exist: " << contaminants_file << "\n"; contaminants = FileConstants::contaminants; return; } std::ifstream in(contaminants_file); if (!in) - throw std::runtime_error("problem opening contaminants file: " + contaminants_file); + throw std::runtime_error("problem opening contaminants file: " + + contaminants_file); if (!quiet) std::cerr << "[contaminants]\tusing file " << contaminants_file << "\n"; @@ -621,516 +596,23 @@ FalcoConfig::read_contaminants_file() { // instance is the biological sequence std::string line; contaminants.clear(); - while (getline(in, line)) { + while (std::getline(in, line)) { if (is_content_line(line)) { std::istringstream iss(line); std::string token; while (iss >> token) line_by_space.push_back(token); - if (line_by_space.size() > 1) { + if (std::size(line_by_space) > 1) { std::string contaminant_name = line_by_space[0]; - for (size_t i = 1; i < line_by_space.size() - 1; ++i) + for (size_t i = 1; i < std::size(line_by_space) - 1; ++i) contaminant_name += " " + line_by_space[i]; - contaminants.push_back(std::make_pair(contaminant_name, line_by_space.back())); + contaminants.push_back( + std::make_pair(contaminant_name, line_by_space.back())); } line_by_space.clear(); } } - in.close(); } -const std::string FalcoConfig::html_template = -"" -"" -" " -" " -"" -" " -" {{filename}} - report" -" " -"" -"" -"" -"" -"" -"" -"
" -"
Report
" -"
{{date}}
{{filename}}" -"
" -"
" -"

Summary

" -"" -"
" -"
" -"
" -"

" -" {{basicstatisticsname}}: {{passbasicstatistics}}" -"

" -" {{basicstatisticsdata}}" -"
" -"" -"{{perbasesequencequalitycs}}" -"
" -"

" -" {{perbasesequencequalityname}}: {{passperbasesequencequality}}

" -"
" -"
" -"{{perbasesequencequalityce}}" -"" -"" -"{{pertilesequencequalitycs}}" -"
" -"

" -" {{pertilesequencequalityname}} : {{passpertilesequencequality}}" -"

" -"
" -"
" -"{{pertilesequencequalityce}}" -"" -"{{persequencequalityscorescs}}" -"
" -"

" -" {{persequencequalityscoresname}} : {{passpersequencequalityscores}}" -"

" -"
" -"
" -"{{persequencequalityscoresce}}" -"" -"{{perbasesequencecontentcs}}" -"
" -"

" -" {{perbasesequencecontentname}} : {{passperbasesequencecontent}}" -"

" -"
" -"
" -"{{perbasesequencecontentce}}" -"" -"{{persequencegccontentcs}}" -"
" -"

" -" {{persequencegccontentname}}: {{passpersequencegccontent}}" -"

" -"
" -"
" -"{{persequencegccontentce}}" -"" -"" -"{{perbasencontentcs}}" -"
" -"

" -" {{perbasencontentname}} : {{passperbasencontent}}" -"

" -"
" -"
" -"{{perbasencontentce}}" -"" -"{{sequencelengthdistributioncs}}" -"
" -"

" -" {{sequencelengthdistributionname}} : {{passsequencelengthdistribution}}" -"

" -"
" -"
" -"{{sequencelengthdistributionce}}" -"" -"{{sequenceduplicationlevelscs}}" -"
" -"

" -" {{sequenceduplicationlevelsname}} : {{passsequenceduplicationlevels}}" -"

" -"
" -"
" -"{{sequenceduplicationlevelsce}}" -"" -"{{overrepresentedsequencescs}}" -"
" -"

" -" {{overrepresentedsequencesname}} : {{passoverrepresentedsequences}}

" -" {{overrepresentedsequencesdata}}" -"
" -"{{overrepresentedsequencesce}}" -"" -"{{adaptercontentcs}}" -"
" -"

" -" {{adaptercontentname}} : {{passadaptercontent}}" -"

" -"
" -"
" -"{{adaptercontentce}}" -"" -"{{kmercontentcs}}" -"
" -"

" -" {{kmercontentname}} : {{passkmercontent}}" -"

" -"
" -"
" -"{{kmercontentce}}" -"" -"" -"
" -"
Falco " + FalcoConfig::FalcoVersion + -"
" -"" -"" -"" -"" -"" -"" -"" -"" -""; +const std::string FalcoConfig::html_template = falco_config_html_template; From 668a9eb958425937aa999c6967e9eaa5c4e91829 Mon Sep 17 00:00:00 2001 From: Andrew D Smith Date: Sun, 1 Mar 2026 18:51:58 -0800 Subject: [PATCH 3/3] Makefile.am: updating sources list for distribution to include src/html_template.hpp --- Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.am b/Makefile.am index 0876e92..46a242b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -47,6 +47,7 @@ falco_SOURCES = \ src/HtmlMaker.hpp \ src/StreamReader.hpp \ src/FalcoConfig.hpp \ + src/html_template.hpp \ src/OptionParser.hpp \ src/smithlab_utils.hpp \ src/aux.hpp