Skip to content

Commit

Permalink
extract function (read sequence twice, but faster check)
Browse files Browse the repository at this point in the history
  • Loading branch information
frederic-mahe committed Feb 17, 2025
1 parent 968476e commit d79494e
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions src/fastq_stats.cc
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
#include "vsearch.h"
#include "utils/maps.hpp"
#include <array>
#include <algorithm> // std::max, std::find_if, std::transform
#include <algorithm> // std::max, std::find_if, std::transform, std::minmax_element
#include <cassert>
#include <cinttypes> // macros PRIu64 and PRId64
#include <cmath> // std::pow
Expand All @@ -80,6 +80,11 @@ constexpr std::array<uint64_t, 4> quality_thresholds = {5, 10, 15, 20};
constexpr std::array<double, 4> ee_thresholds = { 1.0, 0.5, 0.25, 0.1 };
constexpr auto n_eight_bit_values = std::size_t{256};

struct Span {
char * start;
std::size_t n_elements;
};

struct Distributions {
double avgq = 0.0;
double avgp = 0.0;
Expand Down Expand Up @@ -132,6 +137,19 @@ auto check_quality_score(struct Parameters const & parameters, unsigned int cons
}


auto check_minmax_scores(struct Span const a_span,
std::vector<uint64_t> const & symbol_to_score,
struct Parameters const & parameters) -> void {
if (a_span.n_elements == 0) { return; }
auto const minmax_scores =
std::minmax_element(a_span.start, a_span.start + a_span.n_elements);
auto const qmin = symbol_to_score[*std::get<0>(minmax_scores)];
auto const qmax = symbol_to_score[*std::get<1>(minmax_scores)];
check_quality_score(parameters, qmin);
check_quality_score(parameters, qmax);
}


// auto check_quality_symbols(struct Parameters const & parameters,
// std::vector<uint64_t> const & quality_symbols) -> void {
// // offset = parameters.opt_fastq_ascii;
Expand Down Expand Up @@ -535,11 +553,13 @@ auto fastq_stats(struct Parameters const & parameters) -> void
auto * quality_symbols = fastq_get_quality(input_handle);
auto expected_error = 0.0;
auto qmin = std::numeric_limits<uint64_t>::max(); // lowest Q value observed in this read

check_minmax_scores(Span{quality_symbols, length}, symbol_to_score, parameters);

for (auto i = 0UL; i < length; ++i)
{
auto const quality_symbol = static_cast<unsigned char>(quality_symbols[i]);
auto const quality_score = symbol_to_score[quality_symbol];
check_quality_score(parameters, quality_score); // refactoring: perform after parsing the read, by reading quality_chars

++qual_length_table[i][quality_symbol];

Expand Down

0 comments on commit d79494e

Please sign in to comment.