/** * Determines whether a pair of SAMRecord matches this filter * * @param first the first SAMRecord to evaluate * @param second the second SAMRecord to evaluate * * @return true if both SAMRecords do not overlap the interval list */ @Override public boolean filterOut(final SAMRecord first, final SAMRecord second) { return filterOut(first) && filterOut(second); } }
@Test(dataProvider = "testData") public void testIntervalPairFilter(final List<Interval> intervals, final long expectedPassingRecords) { final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervals); long actualPassingRecords = builder.getRecords().stream() .filter(rec -> !filter.filterOut(rec)) .count(); Assert.assertEquals(actualPassingRecords, expectedPassingRecords); }
case includePairedIntervals: filteringIterator = new FilteringSamIterator(samReader.iterator(), new IntervalKeepPairFilter(getIntervalList(INTERVAL_LIST))); break; case includeTagValues:
/** * Determines whether a SAMRecord matches this filter. Takes record, finds * the location of its mate using the MC tag. Checks if either record * overlaps the current interval using overlap detector. If yes, return * false -> don't filter it out. * * If a read is secondary, supplementary, or single ended, filter read out. * Use {@link IntervalFilter} if you want to keep these reads, but NOTE: the * resulting bam may not be valid. * * @param record the SAMRecord to evaluate * @return true if the SAMRecord matches the filter, otherwise false */ @Override public boolean filterOut(final SAMRecord record) { if (record.isSecondaryOrSupplementary() || !record.getReadPairedFlag()) { return true; } if (!record.getReadUnmappedFlag() && hasOverlaps(record.getReferenceName(), record.getStart(), record.getEnd())) { return false; } return record.getMateUnmappedFlag() || !hasOverlaps(record.getMateReferenceName(), record.getMateAlignmentStart(), SAMUtils.getMateAlignmentEnd(record)); }
@Test public void testSingleEndedReads() { final List<Interval> intervalList = new ArrayList<>(); final Interval interval1 = new Interval("chr1", 1, 999); intervalList.add(interval1); final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList); boolean singleEnded = builder.getRecords().stream() .filter(rec -> !filter.filterOut(rec)) .anyMatch(rec -> rec.getReadName().equals("single_ended")); Assert.assertFalse(singleEnded); }
case includePairedIntervals: filteringIterator = new FilteringSamIterator(samReader.iterator(), new IntervalKeepPairFilter(getIntervalList(INTERVAL_LIST))); break; case includeTagValues:
/** * Determines whether a SAMRecord matches this filter. Takes record, finds * the location of its mate using the MC tag. Checks if either record * overlaps the current interval using overlap detector. If yes, return * false -> don't filter it out. * * If a read is secondary, supplementary, or single ended, filter read out. * Use {@link IntervalFilter} if you want to keep these reads, but NOTE: the * resulting bam may not be valid. * * @param record the SAMRecord to evaluate * @return true if the SAMRecord matches the filter, otherwise false */ @Override public boolean filterOut(final SAMRecord record) { if (record.isSecondaryOrSupplementary() || !record.getReadPairedFlag()) { return true; } if (!record.getReadUnmappedFlag() && hasOverlaps(record.getReferenceName(), record.getStart(), record.getEnd())) { return false; } return record.getMateUnmappedFlag() || !hasOverlaps(record.getMateReferenceName(), record.getMateAlignmentStart(), SAMUtils.getMateAlignmentEnd(record)); }
@Test public void testNotPrimaryReads() { final List<Interval> intervalList = new ArrayList<>(); final Interval interval1 = new Interval("chr1", 1, 999); intervalList.add(interval1); final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList); boolean notPrimary = builder.getRecords().stream() .filter(rec -> !filter.filterOut(rec)) .anyMatch(rec -> rec.isSecondaryAlignment() || rec.getSupplementaryAlignmentFlag()); Assert.assertFalse(notPrimary); }
/** * Determines whether a pair of SAMRecord matches this filter * * @param first the first SAMRecord to evaluate * @param second the second SAMRecord to evaluate * * @return true if both SAMRecords do not overlap the interval list */ @Override public boolean filterOut(final SAMRecord first, final SAMRecord second) { return filterOut(first) && filterOut(second); } }
@Test public void testUnmappedPair() { final List<Interval> intervalList = new ArrayList<>(); final Interval interval1 = new Interval("chr1", 1, 999); final Interval interval2 = new Interval("chr3", 1, 2); final Interval interval3 = new Interval("chr2", 1, 2); final Interval interval4 = new Interval("chr4", 1, 2); intervalList.addAll(CollectionUtil.makeList(interval1, interval2, interval3, interval4)); final IntervalKeepPairFilter filter = new IntervalKeepPairFilter(intervalList); boolean unmappedPassed = builder.getRecords().stream() .filter(rec -> !filter.filterOut(rec)) .anyMatch(rec -> rec.getReadName().equals("both_unmapped")); Assert.assertFalse(unmappedPassed); }