From ebcb997840a4e36ff1055da90ffec40b73e48664 Mon Sep 17 00:00:00 2001 From: Ruben Vorderman Date: Fri, 28 Apr 2023 06:51:24 +0200 Subject: [PATCH] Ensure calculation is unsigned by explicitly typing the intermediate results --- src/cutadapt/qualtrim.pyx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cutadapt/qualtrim.pyx b/src/cutadapt/qualtrim.pyx index be316417..7bcaa7ab 100644 --- a/src/cutadapt/qualtrim.pyx +++ b/src/cutadapt/qualtrim.pyx @@ -147,7 +147,7 @@ def poly_a_trim_index(str s): # calculation every time. cdef double[94] QUAL_TO_ERROR_RATE = [10 ** (-q / 10) for q in range(94)] -def expected_errors(str qualities, int base=33): +def expected_errors(str qualities, uint8_t base=33): """ Return the number of expected errors (as double) from a read’s qualities. @@ -161,12 +161,14 @@ def expected_errors(str qualities, int base=33): raise ValueError(f"Quality string contains non-ASCII values: {qualities}") cdef: size_t i + uint8_t phred, q uint8_t *quals = PyUnicode_DATA(qualities) size_t qual_length = PyUnicode_GET_LENGTH(qualities) double e = 0.0 for i in range(qual_length): - q = quals[i] - base + phred = quals[i] + q = phred - base if q > 93: raise ValueError(f"Not a valid phred value {q} for character {ord(q)}") e += QUAL_TO_ERROR_RATE[q]