Esempio n. 1
0
 @Test
 public void inputResourceFromStringTest() throws IOException {
   Assert.assertEquals(
       SamInputResource.of("http://test.url").data().type(), InputResource.Type.URL);
   Assert.assertEquals(
       SamInputResource.of("https://test.url").data().type(), InputResource.Type.URL);
   Assert.assertEquals(
       SamInputResource.of("ftp://test.url").data().type(), InputResource.Type.URL);
   Assert.assertEquals(SamInputResource.of("/a/b/c").data().type(), InputResource.Type.FILE);
 }
Esempio n. 2
0
  @Test(dataProvider = "composeAllPermutationsOfSamInputResource")
  public void queryInputResourcePermutation(final SamInputResource resource) throws IOException {
    final SamReader reader = SamReaderFactory.makeDefault().open(resource);
    LOG.info(String.format("Query from %s ...", resource));
    if (reader.hasIndex()) {
      final StopWatch stopWatch = new StopWatch();
      stopWatch.start();
      final SAMRecordIterator q1 = reader.query("chr1", 500000, 100000000, true);
      observedRecordOrdering1.add(Iterables.slurp(q1));
      q1.close();
      final SAMRecordIterator q20 = reader.query("chr20", 1, 1000000, true);
      observedRecordOrdering20.add(Iterables.slurp(q20));
      q20.close();
      final SAMRecordIterator q3 = reader.query("chr3", 1, 10000000, true);
      observedRecordOrdering3.add(Iterables.slurp(q3));
      q3.close();
      stopWatch.stop();
      LOG.info(String.format("Finished queries in %sms", stopWatch.getElapsedTime()));

      Assert.assertEquals(
          observedRecordOrdering1.size(), 1, "read different records for chromosome 1");
      Assert.assertEquals(
          observedRecordOrdering20.size(), 1, "read different records for chromosome 20");
      Assert.assertEquals(
          observedRecordOrdering3.size(), 1, "read different records for chromosome 3");
    } else if (resource.indexMaybe() != null) {
      LOG.warn("Resource has an index source, but is not indexed: " + resource);
    } else {
      LOG.info("Skipping query operation: no index.");
    }
    reader.close();
  }
Esempio n. 3
0
 @Test
 public void testSamReaderFromURL() throws IOException {
   final String samFilePath = new File(TEST_DATA_DIR, "unsorted.sam").getAbsolutePath();
   final URL samURL = new URL("file://" + samFilePath);
   final SamReaderFactory factory =
       SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
   final SamReader reader = factory.open(SamInputResource.of(samURL));
   Assert.assertEquals(countRecords(reader), 10);
 }
Esempio n. 4
0
 @Test
 public void testSamReaderFromSeekableStream() throws IOException {
   // even though a SAM isn't indexable, make sure we can open one
   // using a seekable stream
   final File samFile = new File(TEST_DATA_DIR, "unsorted.sam");
   final SamReaderFactory factory =
       SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
   final SamReader reader = factory.open(SamInputResource.of(new SeekableFileStream(samFile)));
   Assert.assertEquals(countRecords(reader), 10);
 }
Esempio n. 5
0
 @Test(expectedExceptions = RuntimeIOException.class)
 public void testCRAMReaderFromURLBadIndexFile() throws IOException {
   // deliberately specify a bad index file to ensure we get an IOException
   getCRAMReaderFromInputResource(
       (cramURL, indexURL) -> {
         return SamInputResource.of(cramURL).index(new File("nonexistent.bai"));
       },
       true,
       3);
 }
Esempio n. 6
0
 @Test
 public void testCRAMReaderFromURLNoIndexFile() throws IOException {
   // get just a CRAM reader (no index) from an URL-backed resource
   getCRAMReaderFromInputResource(
       (cramURL, indexURL) -> {
         return SamInputResource.of(cramURL);
       },
       false,
       11);
 }
Esempio n. 7
0
 @Test
 public void testCRAMReaderFromURL() throws IOException {
   // get a CRAM reader with an index from a URL-backed resource
   getCRAMReaderFromInputResource(
       (cramURL, indexURL) -> {
         return SamInputResource.of(cramURL).index(indexURL);
       },
       true,
       3);
 }
Esempio n. 8
0
 @Test(expectedExceptions = SAMFormatException.class)
 public void testSamReaderFromMalformedSeekableStream() throws IOException {
   // use a bogus (.bai file) to force SamReaderFactory to fall through to the
   // fallback code that assumes a SAM File when it can't determine the
   // format of the input, to ensure that it results in a SAMFormatException
   final File samFile = new File(TEST_DATA_DIR, "cram_with_bai_index.cram.bai");
   final SamReaderFactory factory =
       SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
   final SamReader reader = factory.open(SamInputResource.of(new SeekableFileStream(samFile)));
   countRecords(reader);
 }
Esempio n. 9
0
  private void runLocalRemoteTest(
      final URL bamURL,
      final File bamFile,
      final String sequence,
      final int startPos,
      final int endPos,
      final boolean contained) {
    verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
    final SamReader reader1 =
        SamReaderFactory.makeDefault()
            .disable(SamReaderFactory.Option.EAGERLY_DECODE)
            .open(SamInputResource.of(bamFile).index(BAM_INDEX_FILE));
    final SamReader reader2 =
        SamReaderFactory.makeDefault()
            .disable(SamReaderFactory.Option.EAGERLY_DECODE)
            .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
    final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
    final Iterator<SAMRecord> iter2 = reader2.query(sequence, startPos, endPos, contained);

    final List<SAMRecord> records1 = new ArrayList<SAMRecord>();
    final List<SAMRecord> records2 = new ArrayList<SAMRecord>();

    while (iter1.hasNext()) {
      records1.add(iter1.next());
    }
    while (iter2.hasNext()) {
      records2.add(iter2.next());
    }

    assertTrue(records1.size() > 0);
    assertEquals(records1.size(), records2.size());
    for (int i = 0; i < records1.size(); i++) {
      // System.out.println(records1.get(i).format());
      assertEquals(records1.get(i).getSAMString(), records2.get(i).getSAMString());
    }
  }
Esempio n. 10
0
  private List<String> getReferenceNames(final URL bamFile) throws IOException {

    final SamReader reader =
        SamReaderFactory.makeDefault().open(SamInputResource.of(bamFile.openStream()));

    final List<String> result = new ArrayList<String>();
    final List<SAMSequenceRecord> seqRecords =
        reader.getFileHeader().getSequenceDictionary().getSequences();
    for (final SAMSequenceRecord seqRecord : seqRecords) {
      if (seqRecord.getSequenceName() != null) {
        result.add(seqRecord.getSequenceName());
      }
    }
    reader.close();
    return result;
  }
Esempio n. 11
0
 @Test
 public void testCRAMReaderFromURLStream() throws IOException {
   // get a CRAM reader with an index from a stream-backed resource created from a URL
   getCRAMReaderFromInputResource(
       (cramURL, indexURL) -> {
         try {
           ISeekableStreamFactory streamFactory = SeekableStreamFactory.getInstance();
           return SamInputResource.of(streamFactory.getStreamFor(cramURL))
               .index(streamFactory.getStreamFor(indexURL));
         } catch (IOException e) {
           throw new RuntimeIOException(e);
         }
       },
       true,
       3);
 }
Esempio n. 12
0
  public SamReader getSamReader(ResourceLocator locator, boolean requireIndex) throws IOException {

    if (requireIndex) {
      final SamReaderFactory factory =
          SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);

      SeekableStream indexStream = getIndexStream(locator.getBamIndexPath());
      this.indexed = true;

      SeekableStream ss =
          new IGVSeekableBufferedStream(
              IGVSeekableStreamFactory.getInstance().getStreamFor(url), 128000);
      SamInputResource resource = SamInputResource.of(ss).index(indexStream);
      return factory.open(resource);
    } else {
      InputStream is = HttpUtils.getInstance().openConnectionStream(url);
      return new SAMFileReader(new BufferedInputStream(is));
    }
  }
Esempio n. 13
0
  @Test
  public void customReaderFactoryTest() throws IOException {
    try {
      CustomReaderFactory.setInstance(
          new CustomReaderFactory(
              "https://www.googleapis.com/genomics/v1beta/reads/,"
                  + "htsjdk.samtools.SamReaderFactoryTest$TestReaderFactory"));
      final SamReader reader =
          SamReaderFactory.makeDefault()
              .open(
                  SamInputResource.of(
                      "https://www.googleapis.com/genomics/v1beta/reads/?uncompressed.sam"));
      int i = 0;
      for (@SuppressWarnings("unused") final SAMRecord ignored : reader) {
        ++i;
      }
      reader.close();

      Assert.assertTrue(i > 0);
    } finally {
      CustomReaderFactory.resetToDefaultInstance();
    }
  }
Esempio n. 14
0
 private int runQueryTest(
     final URL bamURL,
     final String sequence,
     final int startPos,
     final int endPos,
     final boolean contained) {
   verbose("Testing query " + sequence + ":" + startPos + "-" + endPos + " ...");
   final SamReader reader1 =
       SamReaderFactory.makeDefault()
           .disable(SamReaderFactory.Option.EAGERLY_DECODE)
           .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
   final SamReader reader2 =
       SamReaderFactory.makeDefault()
           .disable(SamReaderFactory.Option.EAGERLY_DECODE)
           .open(SamInputResource.of(bamURL).index(BAM_INDEX_FILE));
   final Iterator<SAMRecord> iter1 = reader1.query(sequence, startPos, endPos, contained);
   final Iterator<SAMRecord> iter2 = reader2.iterator();
   // Compare ordered iterators.
   // Confirm that iter1 is a subset of iter2 that properly filters.
   SAMRecord record1 = null;
   SAMRecord record2 = null;
   int count1 = 0;
   int count2 = 0;
   int beforeCount = 0;
   int afterCount = 0;
   while (true) {
     if (record1 == null && iter1.hasNext()) {
       record1 = iter1.next();
       count1++;
     }
     if (record2 == null && iter2.hasNext()) {
       record2 = iter2.next();
       count2++;
     }
     // System.out.println("Iteration:");
     // System.out.println(" Record1 = " + ((record1 == null) ? "null" : record1.format()));
     // System.out.println(" Record2 = " + ((record2 == null) ? "null" : record2.format()));
     if (record1 == null && record2 == null) {
       break;
     }
     if (record1 == null) {
       checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
       record2 = null;
       afterCount++;
       continue;
     }
     assertNotNull(record2);
     final int ordering = compareCoordinates(record1, record2);
     if (ordering > 0) {
       checkPassesFilter(false, record2, sequence, startPos, endPos, contained);
       record2 = null;
       beforeCount++;
       continue;
     }
     assertTrue(ordering == 0);
     checkPassesFilter(true, record1, sequence, startPos, endPos, contained);
     checkPassesFilter(true, record2, sequence, startPos, endPos, contained);
     assertEquals(record1.getReadName(), record2.getReadName());
     assertEquals(record1.getReadString(), record2.getReadString());
     record1 = null;
     record2 = null;
   }
   CloserUtil.close(reader1);
   CloserUtil.close(reader2);
   verbose("Checked " + count1 + " records against " + count2 + " records.");
   verbose("Found " + (count2 - beforeCount - afterCount) + " records matching.");
   verbose("Found " + beforeCount + " records before.");
   verbose("Found " + afterCount + " records after.");
   return count1;
 }