/** * * @param querynameOrderIterator * @param primaryAlignmentSelectionStrategy Algorithm for selecting primary alignment when it is not clear from * the input what should be primary. */ MultiHitAlignedReadIterator(final CloseableIterator<SAMRecord> querynameOrderIterator, final PrimaryAlignmentSelectionStrategy primaryAlignmentSelectionStrategy) { this.primaryAlignmentSelectionStrategy = primaryAlignmentSelectionStrategy; peekIterator = new PeekableIterator<SAMRecord>(new FilteringSamIterator(querynameOrderIterator, new SamRecordFilter() { // Filter unmapped reads. public boolean filterOut(final SAMRecord record) { return record.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(record.getCigar()); } public boolean filterOut(final SAMRecord first, final SAMRecord second) { return ((first.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(first.getCigar())) && (second.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(second.getCigar()))); } })); advance(); }
/** * * @param querynameOrderIterator * @param primaryAlignmentSelectionStrategy Algorithm for selecting primary alignment when it is not clear from * the input what should be primary. */ MultiHitAlignedReadIterator(final CloseableIterator<SAMRecord> querynameOrderIterator, final PrimaryAlignmentSelectionStrategy primaryAlignmentSelectionStrategy) { this.primaryAlignmentSelectionStrategy = primaryAlignmentSelectionStrategy; peekIterator = new PeekableIterator<SAMRecord>(new FilteringSamIterator(querynameOrderIterator, new SamRecordFilter() { // Filter unmapped reads. public boolean filterOut(final SAMRecord record) { return record.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(record.getCigar()); } public boolean filterOut(final SAMRecord first, final SAMRecord second) { return ((first.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(first.getCigar())) && (second.getReadUnmappedFlag() || SAMUtils.cigarMapsNoBasesToRef(second.getCigar()))); } })); advance(); }
public SequentialReferenceCoverageLookup(Iterator<SAMRecord> it, IdsvMetrics metrics, ReadPairConcordanceCalculator pairing, int windowSize, int category, boolean ignoreDuplicates) { this.pairing = pairing; if (it instanceof Closeable) toClose.add((Closeable)it); List<SamRecordFilter> filters = new ArrayList<>(); filters.add(new AlignedFilter(true)); if (ignoreDuplicates) { filters.add(new DuplicateReadFilter()); } this.reads = Iterators.peekingIterator(new FilteringSamIterator(it, new AggregateFilter(filters))); this.largestWindow = windowSize; this.maxEvidenceWindow = Math.max(metrics.MAX_READ_LENGTH, Math.max(metrics.MAX_READ_MAPPED_LENGTH, pairing != null ? pairing.maxConcordantFragmentSize() : 0)); this.category = category; } public void close() {
/** * Applies filters such as duplicate removal that apply to all SAMRecord parsing * @param iterator raw reads * @param filterSecondaryAlignment should secondary alignment be filtered out * @return iterator with filtered record excluded */ public CloseableIterator<SAMRecord> applyCommonSAMRecordFilters(final CloseableIterator<SAMRecord> iterator, final boolean singleAlignmentPerRead) { List<SamRecordFilter> filters = Lists.<SamRecordFilter>newArrayList(new FailsVendorReadQualityFilter()); if (singleAlignmentPerRead) { filters.add(new SecondaryOrSupplementaryFilter()); } if (filterDuplicates) { filters.add(new DuplicateReadFilter()); } return new AutoClosingIterator<SAMRecord>(new FilteringSamIterator(iterator, new AggregateFilter(filters)), iterator); }
/** * @return iterator over all/all covered locus position in reference according to <code>emitUncoveredLoci</code> * value. */ @Override public Iterator<K> iterator() { if (samIterator != null) { throw new IllegalStateException("Cannot call iterator() more than once on " + this.getClass().getSimpleName()); } CloseableIterator<SAMRecord> tempIterator; if (intervals != null) { tempIterator = new SamRecordIntervalIteratorFactory().makeSamRecordIntervalIterator(samReader, intervals, useIndex); } else { tempIterator = samReader.iterator(); } if (samFilters != null) { tempIterator = new FilteringSamIterator(tempIterator, new AggregateFilter(samFilters)); } samIterator = new PeekableIterator<>(tempIterator); return this; }
/** * @return iterator over all/all covered locus position in reference according to <code>emitUncoveredLoci</code> * value. */ @Override public Iterator<K> iterator() { if (samIterator != null) { throw new IllegalStateException("Cannot call iterator() more than once on " + this.getClass().getSimpleName()); } CloseableIterator<SAMRecord> tempIterator; if (intervals != null) { tempIterator = new SamRecordIntervalIteratorFactory().makeSamRecordIntervalIterator(samReader, intervals, useIndex); } else { tempIterator = samReader.iterator(); } if (samFilters != null) { tempIterator = new FilteringSamIterator(tempIterator, new AggregateFilter(samFilters)); } samIterator = new PeekableIterator<>(tempIterator); return this; }
@Test public void testFilterNames() { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); names.forEach(builder::addUnmappedFragment); FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new ReadNameFilter(new File(TEST_DIR, "names.txt"), true)); Assert.assertEquals(filteringSamIterator.stream() .peek(s -> Assert.assertTrue(s.getReadName().contains("filter"))) .count(), 3); }
@Test(dataProvider = "testReadsData") public void testReads(final IntervalList list, final SAMFileHeader fileHeader, final Collection<SAMRecord> recordCollection, final int expectedPassing, final int expectedTotal ) { IntervalFilter intervalFilter = new IntervalFilter(list.getIntervals(), fileHeader); FilteringSamIterator filteringSamIterator = new FilteringSamIterator(recordCollection.iterator(), intervalFilter); // check that the total number of passing reads is the expected number Assert.assertEquals(filteringSamIterator.stream() // check that the reads that pass have the word "intersecting" in their name .peek(s -> Assert.assertTrue(s.getReadName().contains("intersecting"))) .count(), expectedPassing); //check that the total number of reads given in the Collection, is the expected number Assert.assertEquals(recordCollection.size(), expectedTotal); } }
@Test(dataProvider = "TrueFalse") public void testFilterNamesEmptySetTrue(boolean include) { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); names.forEach(builder::addUnmappedFragment); FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new ReadNameFilter(Collections.emptySet(), include)); Assert.assertEquals(filteringSamIterator.hasNext(), !include); Assert.assertEquals(filteringSamIterator.stream().count(), include ? 0 : names.size()); } }
final FilteringSamIterator filterIterator = new FilteringSamIterator(reader.iterator(), filter); if (filterIterator.hasNext()) { readGroupToFormat.put(rg, QualityEncodingDetector.detect(
final FilteringSamIterator filterIterator = new FilteringSamIterator(reader.iterator(), filter); if (filterIterator.hasNext()) { readGroupToFormat.put(rg, QualityEncodingDetector.detect(
@Test public void testPrimaryRecords() { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); int i = 0; for (boolean record1Unmapped : new boolean[]{true, false}) { for (boolean record2Unmapped : new boolean[]{true, false}) { for (boolean record1Strand : new boolean[]{true, false}) { for (boolean record2Strand : new boolean[]{true, false}) { builder.addPair("pair" + i, 0, 10, 30, record1Unmapped, record2Unmapped, null, null, record1Strand, record2Strand, false, false, 10); builder.addFrag("frag" + i++, 0, 10, record1Unmapped, record2Strand, null, null, 10, false); } } } } FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryAlignmentFilter()); // i is incremented once for each 3 records that are added (a pair and a fragment) Assert.assertEquals(filteringSamIterator.stream().count(), i * 3); }
FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryOrSupplementaryFilter());
@Test public void testSupplementaryRecords() { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); int i = 0; for (boolean record1Unmapped : new boolean[]{true, false}) { for (boolean record2Unmapped : new boolean[]{true, false}) { for (boolean record1Strand : new boolean[]{true, false}) { for (boolean record2Strand : new boolean[]{true, false}) { builder.addPair("pair" + i, 0, 10, 30, record1Unmapped, record2Unmapped, null, null, record1Strand, record2Strand, false, false, 10).stream().forEach(r -> r.setSupplementaryAlignmentFlag(true)); builder.addFrag("frag" + i++, 0, 10, record1Unmapped, record2Strand, null, null, 10, false).setSupplementaryAlignmentFlag(true); } } } } FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryOrSupplementaryFilter()); Assert.assertEquals(filteringSamIterator.hasNext(), false); }
@Test public void testSecondaryRecords() { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); int i = 0; for (boolean record1Unmapped : new boolean[]{true, false}) { for (boolean record2Unmapped : new boolean[]{true, false}) { for (boolean record1Strand : new boolean[]{true, false}) { for (boolean record2Strand : new boolean[]{true, false}) { builder.addPair("pair" + i, 0, 10, 30, record1Unmapped, record2Unmapped, null, null, record1Strand, record2Strand, true, true, 10); builder.addFrag("frag" + i++, 0, 10, record1Unmapped, record2Strand, null, null, 10, true); } } } } FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryOrSupplementaryFilter()); Assert.assertEquals(filteringSamIterator.hasNext(), false); }
@Test public void testSecondaryRecords() { SAMRecordSetBuilder builder = new SAMRecordSetBuilder(); int i = 0; for (boolean record1Unmapped : new boolean[]{true, false}) { for (boolean record2Unmapped : new boolean[]{true, false}) { for (boolean record1Strand : new boolean[]{true, false}) { for (boolean record2Strand : new boolean[]{true, false}) { builder.addPair("pair" + i, 0, 10, 30, record1Unmapped, record2Unmapped, null, null, record1Strand, record2Strand, true, true, 10); builder.addFrag("frag" + i++, 0, 10, record1Unmapped, record2Strand, null, null, 10, true); } } } } FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryAlignmentFilter()); Assert.assertEquals(filteringSamIterator.hasNext(), false); }
FilteringSamIterator filteringSamIterator = new FilteringSamIterator(builder.getRecords().iterator(), new SecondaryAlignmentFilter());
/** * Path for writing bfqs for single-end reads * * @param iterator the iterator with he SAM Records to write * @param filters the list of filters to be applied */ private void writeSingleEndBfqs(final Iterator<SAMRecord> iterator, final List<SamRecordFilter> filters) { // Open the codecs for writing int fileIndex = 0; initializeNextBfqFiles(fileIndex++); int records = 0; final FilteringSamIterator it = new FilteringSamIterator(iterator, new AggregateFilter(filters)); while (it.hasNext()) { final SAMRecord record = it.next(); records++; if (records % increment == 0) { record.setReadName(record.getReadName() + "/1"); writeFastqRecord(codec1, record); wrote++; if (wrote % 1000000 == 0) { log.info(wrote + " records processed."); } if (chunk > 0 && wrote % chunk == 0) { initializeNextBfqFiles(fileIndex++); } } } }
/** * Path for writing bfqs for single-end reads * * @param iterator the iterator with he SAM Records to write * @param filters the list of filters to be applied */ private void writeSingleEndBfqs(final Iterator<SAMRecord> iterator, final List<SamRecordFilter> filters) { // Open the codecs for writing int fileIndex = 0; initializeNextBfqFiles(fileIndex++); int records = 0; final FilteringSamIterator it = new FilteringSamIterator(iterator, new AggregateFilter(filters)); while (it.hasNext()) { final SAMRecord record = it.next(); records++; if (records % increment == 0) { record.setReadName(record.getReadName() + "/1"); writeFastqRecord(codec1, record); wrote++; if (wrote % 1000000 == 0) { log.info(wrote + " records processed."); } if (chunk > 0 && wrote % chunk == 0) { initializeNextBfqFiles(fileIndex++); } } } }
filters.add(new FailsVendorReadQualityFilter()); final FilteringSamIterator itr = new FilteringSamIterator(it, new AggregateFilter(filters)); while (itr.hasNext()) { itr.next();