Skip to content

Commit 34bad2d

Browse files
committed
Adjust maxMergedLength/minMergedLength in mergeReadPairPartial if they are larger than lenF + lenR, to avoid underflow in size_t subtraction
1 parent 1985678 commit 34bad2d

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# mutscan 0.3.3
2+
3+
* Bugfix in mergeReadPairPartial for situation where specified minMergedLength/maxMergedLength is larger than the total length of the two merged sequences
4+
15
# mutscan 0.3.1
26

37
* Adapt summarizeExperiment to include errorStatistics in metadata(se)

src/digestFastqs.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,12 +829,15 @@ bool mergeReadPairPartial(std::string &varSeqForward, std::vector<int> &varIntQu
829829
if (maxMergedLength == 0) {
830830
maxMergedLength = lenF + lenR;
831831
}
832+
if (maxMergedLength > lenF + lenR) {
833+
maxMergedLength = lenF + lenR;
834+
}
832835
// if maxMergedLength is specified, adjust allowed minOverlap
833836
if (minOverlap < (lenF + lenR - maxMergedLength)) {
834837
minOverlap = (lenF + lenR - maxMergedLength);
835838
}
836839
if (minOverlap > lenF || minOverlap > lenR) {
837-
return true; // no valid overlap possible
840+
return true; // no valid overlap possible
838841
}
839842

840843
if (maxOverlap == 0) {
@@ -851,6 +854,9 @@ bool mergeReadPairPartial(std::string &varSeqForward, std::vector<int> &varIntQu
851854
minMergedLength = lenR;
852855
}
853856
}
857+
if (minMergedLength > lenF + lenR) {
858+
return true; // no valid overlap possible
859+
}
854860
// if minMergedLength is specified, adjust allowed maxOverlap
855861
if (maxOverlap > (lenF + lenR - minMergedLength)) {
856862
maxOverlap = (lenF + lenR - minMergedLength);

tests/testthat/test_digestFastqs_helpers.R

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,22 @@ test_that("mergeReadPairsPartial works", {
397397
expect_identical(res0d$mergedQual, qF2)
398398
expect_identical(res0d$mergedLengths, 7L)
399399
expect_true(res0d$return)
400-
400+
401+
## minMergedLength > lenF + lenR -> no valid overlap
402+
res0e <- mutscan:::test_mergeReadPairPartial(sF2, qF2, sR2, qR2, lF2, lR2, 1, 7, 15, 9, 1, FALSE)
403+
expect_type(res0e, "list")
404+
expect_identical(res0e$mergedSeq, sF2)
405+
expect_identical(res0e$mergedQual, qF2)
406+
expect_identical(res0e$mergedLengths, 7L)
407+
expect_true(res0e$return)
408+
## maxMergedLength > lenF + lenR -> maxMergedLength = lenF + lenR
409+
res0f <- mutscan:::test_mergeReadPairPartial(sF0, qF0, sR0, qR0, lF0, lR0, 1, 0, 5, 19, 1, FALSE)
410+
expect_type(res0f, "list")
411+
expect_identical(res0f$mergedSeq, sF0)
412+
expect_identical(res0f$mergedQual, rep(c(10L, 40L), c(2, 5)))
413+
expect_identical(res0f$mergedLengths, 7L)
414+
expect_false(res0f$return)
415+
401416
## padded reads
402417
for (i in 1:10) {
403418
sF <- paste(rep(c("C","A"), c(i, 6)), collapse = "")

0 commit comments

Comments
 (0)