/** * * @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(); }
@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()); } }
/** * Returns the next element in the iteration. * * @return the next element in the iteration * @throws java.util.NoSuchElementException * */ @Override public SAMRecord next() { if (next == null) { throw new NoSuchElementException("Iterator has no more elements."); } final SAMRecord result = next; next = getNextRecord(); return result; }
/** * 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++); } } } }
final FilteringSamIterator filterIterator = new FilteringSamIterator(reader.iterator(), filter); if (filterIterator.hasNext()) { readGroupToFormat.put(rg, QualityEncodingDetector.detect( QualityEncodingDetector.DEFAULT_MAX_RECORDS_TO_ITERATE, filterIterator, restoreOriginalQualities));
@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); } }
private void filterReads(final FilteringSamIterator filteringIterator) { // get OUTPUT header from INPUT and overwrite it if necessary final SAMFileHeader fileHeader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).getFileHeader(INPUT); final SAMFileHeader.SortOrder inputSortOrder = fileHeader.getSortOrder(); if (SORT_ORDER != null) { fileHeader.setSortOrder(SORT_ORDER); } if (FILTER == Filter.includePairedIntervals && fileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) { throw new UnsupportedOperationException("Input must be coordinate sorted to use includePairedIntervals"); } final boolean presorted = inputSortOrder.equals(fileHeader.getSortOrder()); log.info("Filtering [presorted=" + presorted + "] " + INPUT.getName() + " -> OUTPUT=" + OUTPUT.getName() + " [sortorder=" + fileHeader.getSortOrder().name() + "]"); // create OUTPUT file final SAMFileWriter outputWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fileHeader, presorted, OUTPUT); final ProgressLogger progress = new ProgressLogger(log, (int) 1e6, "Written"); while (filteringIterator.hasNext()) { final SAMRecord rec = filteringIterator.next(); outputWriter.addAlignment(rec); progress.record(rec); } filteringIterator.close(); outputWriter.close(); log.info(new DecimalFormat("#,###").format(progress.getCount()) + " SAMRecords written to " + OUTPUT.getName()); }
/** * 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++); } } } }
final FilteringSamIterator filterIterator = new FilteringSamIterator(reader.iterator(), filter); if (filterIterator.hasNext()) { readGroupToFormat.put(rg, QualityEncodingDetector.detect( QualityEncodingDetector.DEFAULT_MAX_RECORDS_TO_ITERATE, filterIterator, restoreOriginalQualities));
@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); }
private void filterReads(final FilteringSamIterator filteringIterator) { // get OUTPUT header from INPUT and overwrite it if necessary final SAMFileHeader fileHeader = SamReaderFactory.makeDefault().referenceSequence(REFERENCE_SEQUENCE).getFileHeader(INPUT); final SAMFileHeader.SortOrder inputSortOrder = fileHeader.getSortOrder(); if (SORT_ORDER != null) { fileHeader.setSortOrder(SORT_ORDER); } if (FILTER == Filter.includePairedIntervals && fileHeader.getSortOrder() != SAMFileHeader.SortOrder.coordinate) { throw new UnsupportedOperationException("Input must be coordinate sorted to use includePairedIntervals"); } final boolean presorted = inputSortOrder.equals(fileHeader.getSortOrder()); log.info("Filtering [presorted=" + presorted + "] " + INPUT.getName() + " -> OUTPUT=" + OUTPUT.getName() + " [sortorder=" + fileHeader.getSortOrder().name() + "]"); // create OUTPUT file final SAMFileWriter outputWriter = new SAMFileWriterFactory().makeSAMOrBAMWriter(fileHeader, presorted, OUTPUT); final ProgressLogger progress = new ProgressLogger(log, (int) 1e6, "Written"); while (filteringIterator.hasNext()) { final SAMRecord rec = filteringIterator.next(); outputWriter.addAlignment(rec); progress.record(rec); } filteringIterator.close(); outputWriter.close(); log.info(new DecimalFormat("#,###").format(progress.getCount()) + " SAMRecords written to " + OUTPUT.getName()); }
filters.add(new FailsVendorReadQualityFilter()); final FilteringSamIterator itr = new FilteringSamIterator(it, new AggregateFilter(filters)); while (itr.hasNext()) { itr.next(); count++;
/** * * @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(); }
@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 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); }
/** * Returns the next element in the iteration. * * @return the next element in the iteration * @throws java.util.NoSuchElementException * */ @Override public SAMRecord next() { if (next == null) { throw new NoSuchElementException("Iterator has no more elements."); } final SAMRecord result = next; next = getNextRecord(); return result; }
filters.add(new FailsVendorReadQualityFilter()); final FilteringSamIterator itr = new FilteringSamIterator(it, new AggregateFilter(filters)); while (itr.hasNext()) { itr.next(); count++;
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() {
@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 SecondaryOrSupplementaryFilter()); Assert.assertEquals(filteringSamIterator.stream().count(), i * 3);