Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion neat/variants/contig_variants.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def check_if_del(self, other):

def check_if_ins(self, other):
for insert in self.all_ins:
if np.array_equal(other.genotype, insert.genotype) and insert.contains(other):
if np.array_equal(other.genotype, insert.genotype) and insert.contains(other.position1):
return insert
return None

Expand Down
72 changes: 72 additions & 0 deletions tests/test_variants/test_check_if_ins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
"""
Regression test for fix/contig-variants-check-if-ins.

check_if_ins was passing the variant object to Insertion.contains() which
expects an int (a position). This caused the method to always return None
even when a variant's position falls within an insertion's span.
"""
import numpy as np

from neat.variants.contig_variants import ContigVariants
from neat.variants import Insertion, SingleNucleotideVariant


_GT = np.array([0, 1])


def _ins(pos, alt="ACGTT", length=4, gt=None):
return Insertion(pos, length, alt, gt if gt is not None else _GT.copy(), "42")


def _snv(pos, alt="T", gt=None):
return SingleNucleotideVariant(pos, alt, gt if gt is not None else _GT.copy(), "42")


def test_check_if_ins_finds_containing_insertion():
"""SNV inside insertion span is detected."""
cv = ContigVariants()
ins = _ins(10, "ACGTT", 4)
cv.add_variant(ins)
snv = _snv(11) # position1=11 is within [10, 14)
result = cv.check_if_ins(snv)
assert result is ins


def test_check_if_ins_at_insertion_start():
"""SNV at the insertion's own position is detected."""
cv = ContigVariants()
ins = _ins(10, "ACGTT", 4)
cv.add_variant(ins)
snv = _snv(10)
assert cv.check_if_ins(snv) is ins


def test_check_if_ins_at_insertion_end_exclusive():
"""Position at insertion start + length is outside the span."""
cv = ContigVariants()
ins = _ins(10, "ACGTT", 4) # spans [10, 14)
cv.add_variant(ins)
snv = _snv(14)
assert cv.check_if_ins(snv) is None


def test_check_if_ins_outside_span_returns_none():
cv = ContigVariants()
ins = _ins(10, "ACGTT", 4)
cv.add_variant(ins)
snv = _snv(50)
assert cv.check_if_ins(snv) is None


def test_check_if_ins_empty_returns_none():
cv = ContigVariants()
assert cv.check_if_ins(_snv(10)) is None


def test_check_if_ins_genotype_mismatch_returns_none():
"""Even if position matches, different genotype means no match."""
cv = ContigVariants()
ins = _ins(10, "ACGTT", 4, gt=np.array([1, 0]))
cv.add_variant(ins)
snv = _snv(11, gt=np.array([0, 1])) # different genotype
assert cv.check_if_ins(snv) is None
Loading